5

मुझे आश्चर्य है कि आपके पास निर्देश कोड का उदाहरण है जो $routeChangeError पर कोणीय घटनाओं पर प्रतिक्रिया करता है, जिसमें $rootScope इंजेक्शन किए बिना (लिंक फ़ंक्शन में $on का उपयोग करने के लिए)। यह मेरी राय में एमवी * पैटर्न और "उत्पादन" गंध-कोड में टूट जाता है (निर्देश में रूट स्कोप में हेरफेर करने की संभावना देता है)। अग्रिम में धन्यवाद।रूट रूट इंजेक्शन के बिना निर्देश में कोणीय घटनाओं पर प्रतिक्रिया करना

उत्तर

5

यदि आप केवल ईवेंट सुन रहे हैं, तो आपको $rootScope का उपयोग करने की आवश्यकता नहीं है; उदाहरण के लिए निर्देशक या लिंक फ़ंक्शन से निर्देश के दायरे पर $scope.$on("$routeChangeError")

आप "$routeChangeError" को $rootScope से प्रसारित करते हैं, इसलिए सभी बच्चों को यह प्राप्त होता है।

8

नहीं। $scope पर किसी प्रकार की पहुंच के बिना कोणीय घटनाओं को सुनने का कोई तरीका नहीं है। यह उन कारणों में से एक है जिनके पास $rootScope सेवा है, ताकि आप किसी सेवा या किसी अन्य मॉड्यूल में $scope तक पहुंच प्राप्त कर सकें।

हालांकि, निर्देश में, आपको $rootScope इंजेक्ट करने की आवश्यकता नहीं है क्योंकि आपके पास लिंकिंग फ़ंक्शन में निर्देश में पहले से ही एक अलग दायरा है।

उदाहरण के लिए:

.directive('myDirective', function(){ 
    return { 
     restrict: 'A', 
     link: function(scope, elem, attrs){ 
      scope.$on('some-event', function(e){ 
       // respond to event here 
      }); 
     } 
    }; 
}); 

आपका scope चर एक "अलग" गुंजाइश तो यह किसी भी तरह से अपनी मूल गुंजाइश को प्रभावित नहीं कर सकते हैं। हालांकि, अगर आप कुछ बहन-स्तर मॉड्यूल में किसी ईवेंट को उत्सर्जित करने का प्रयास कर रहे हैं, तो इसमें कुछ अजीब साइड इफेक्ट्स हैं, क्योंकि एपुलर इवेंट्स केवल $emit ऊपर या $broadcast दायरे पदानुक्रम के माध्यम से नीचे की ओर हैं। यदि आप नहीं हैं, तो उपर्युक्त उदाहरण पूरी तरह से काम करना चाहिए।

.directive('myDirective', function($rootScope){ 
    var isolateScope = $rootScope.new(); // creates a new isolate copy of $rootScope 
    return { 
     restrict: 'A', 
     link: function(scope, elem, attrs){ 
      isolateScope.$on('some-event', function(e){ 
       // respond to event here 
      }); 
     } 
    }; 
}); 

यह इतना है कि कोई भी परिवर्तन आपके द्वारा इसमें अन्य मॉड्यूल या सेवाएं प्रभावित नहीं होंगी $rootScope की एक ऐसी ही अलग प्रतिलिपि बना देगा: यदि आप हैं, तो निम्न उदाहरण एक तरह से यह करने के लिए है। यह "smell-code" के साथ किसी भी समस्या को रोक देगा जैसा आपने इसे कहा था।

5

$on विधि आंतरिक Scope.prototype पर परिभाषित किया गया है, और इसका मतलब है इस के बाद से कोणीय में प्रत्येक गुंजाइश Scope निर्माता से बनाई गई है प्रत्येक गुंजाइश एक $on विधि पर ही उपलब्ध है। $rootScope इंजेक्षन की कोई जरूरत नहीं है, बस समारोह की गुंजाइश सीधे जोड़ने के निर्देश पर $on विधि कॉल:

app.directive('myDirective', function(){ 
    return function(scope, element, attrs){ 
    scope.$on('$routeChangeError', function(){ 
     // ... 
    }); 
    } 
}); 
+1

यह मतलब यह है कि समाधान अपने ट्यूटोरियल http://egghead.io/lessons/angularjs- में जॉन Lindquist द्वारा दिखाए निर्देश-मार्ग-हैंडलिंग बस ** खराब डिज़ाइन किया गया है ** (_ कोणीय जेएस $ रूटस्कोप मार्ग परिवर्तन त्रुटियों का पता लगाने और इसे उपयोगकर्ता_ पर प्रदर्शित करने के निर्देश के भीतर उपयोग करें)? असल में यह वीडियो मेरे प्रश्न का ट्रिगर था। –

संबंधित मुद्दे