2013-02-20 17 views
6

में विभिन्न नियंत्रकों के बीच कैसे बातचीत करें सरल उदाहरण। मेरे पास एक खिलाड़ी है इसे 2 खंडों में विभाजित किया गया है: गीत अनुभाग (वर्तमान में खेल रहा है) और प्लेलिस्ट अनुभाग।AngularJS

मेरे पास 2 नियंत्रक हैं (वास्तव में मेरे पास 2 नियंत्रक होने जा रहे हैं, इसलिए मैं पूछ रहा हूं): SongCtrl और PlalistCtrl;

लेकिन उनके बीच कैसे बातचीत करें? उदाहरण के लिए: जब मैं गाना बजाना शुरू करता हूं तो मुझे इसे प्लेलिस्ट के अंदर भी हाइलाइट करने की आवश्यकता होती है।

उत्तर

1

आप नियंत्रक directives या services का उपयोग कर एक दूसरे के साथ बातचीत कर सकते हैं।

अपने उदाहरण के बारे में:

hen I start playing song I need also highlight it inside of playlist. 

इस विशेष मामले आप नियंत्रकों से सीधे डोम को बदलने से बचना चाहिए में। उदाहरण के लिए, आपके पास directive हो सकता है जो प्लेलिस्ट में खेले जाने वाले गीत को हाइलाइट करता है,

+0

आपका क्या मतलब है? मैं नियंत्रक से कुछ बदलने वाला नहीं हूँ। इसके लिए एनजी-क्लास का उपयोग करने जा रहे हैं। – ValeriiVasin

+0

वास्तव में मेरा मतलब है, नियंत्रक से जावास्क्रिप्ट जोड़ने के बजाय 'ng-class' का उपयोग करें। साथ ही, आप एक नियंत्रक होने पर पुनर्विचार करना चाह सकते हैं, यह चीजों को सरल बना देगा। आपके पास अभी भी समर्पित सेवाएं हो सकती हैं (गीत के लिए एक और दूसरा प्लेलिस्ट के लिए) – Ulises

+0

मुझे यह दृष्टिकोण भी पसंद है। इस बारे में सोचेंगे। इसके अलावा अन्य लोग साझा करते हैं कि कैसे "कोणीय-मार्ग" साझा करना है :) आपके प्रतिक्रियाओं के लिए भी धन्यवाद। – ValeriiVasin

9

ऐसा करने का सबसे अच्छा तरीका एक सेवा के साथ है।

.factory('musicPlayer', function() { 
    var currentSongId; 

    // public API 
    return { 
    getCurrentSong: function() { return currentSongId; }, 
    setCurrentSong: function (id) { currentSongId = id; } 
    }; 
}); 

इसके बाद आप अपनी प्लेलिस्ट में इस का उपयोग कर सकते हैं:: मान लीजिए कि आप एक सेवा गाने खेलने (अति सरल) के लिए जिम्मेदार करते

.controller('PlaylistCtrl', function ($scope, musicPlayer) { 
    $scope.isCurrentSong = function(idx) { 
    if ($scope.currentSong == idx) return true; 
    }; 

    $scope.play = function(idx) { 
    musicPlayer.setCurrentSong(idx); 
    }; 

    $scope.$watch(function() { 
    return musicPlayer.getCurrentSong() 
    }, function (id) { 
    $scope.currentSong = id; 
    }); 
}); 

तो आपके विचार तो पहुँच सकता है यह:

<li ng-repeat="song in songs" ng-class="{ active: isCurrentSong($index) }"> 
    <a ng-click="play($index)">{{song.name}}</a> 
</li> 

और आप इसे अपने अन्य नियंत्रक में प्राप्त करने के लिए इसी तरह एक्सेस करेंगे वर्तमान बजाना गीत। अधिक जानकारी के बिना, यह अधिक विशिष्ट होना मुश्किल है, लेकिन यह सबसे अच्छा अभ्यास दृष्टिकोण है।

+0

बहुत बहुत धन्यवाद! यह मेरे प्लेयर की तरह लगता है: डी मुझे तर्कों के रूप में 2 कार्यों के साथ $ घड़ी वाक्यविन्यास नहीं पता है, लेकिन मैं खोजूंगा! – ValeriiVasin