2012-09-08 11 views
15

एंगुलरजेएस स्कोप में। $ लागू होता है() प्रत्येक ईवेंट हैंडलर (इनपुट निर्देश के लिए कीडाउन/इनपुट इवेंट्स, चयन निर्देश के लिए ईवेंट बदलें इत्यादि) और कुछ अन्य मामलों पर कॉल किया जाता है।

small example देखें। ऐसा लगता है कि अन्य दायरे में परिवर्तन होने के बावजूद ngRepeat को फिर से गणना और हर कुंजीपटल पर फिर से खींचा जाता है।

ऐसे निर्णय के लिए तर्क जानना दिलचस्प होगा।

उत्तर

17

इस पर AngularJS लेखकों के लिए बहुत अच्छा होगा, लेकिन मेरा मानना ​​है कि $ digest() को $ रूटस्कोप पर कॉल करने की आवश्यकता है क्योंकि दोहराने वाले परिवर्तनों में ट्रिगर किए गए परिवर्तनों के अन्य क्षेत्रों में साइड इफेक्ट्स हो सकते हैं (यहां तक ​​कि $ रूटस्कोप) ।

बात यह है कि बाल स्कॉप्स में ट्रिगर किए गए तरीके पैरेंट स्कॉप्स में ऑब्जेक्ट्स को प्रभावित कर सकते हैं (चूंकि बाल स्कॉप्स माता-पिता से प्राप्त होते हैं)। इसलिए, यहां तक ​​कि यदि बाल स्कॉप्स में परिभाषित फ़ंक्शंस ऑब्जेक्ट संदर्भ किसी मूल दायरे से संशोधित नहीं कर सकते हैं, फिर भी वे अभिभावक दायरे में परिभाषित वस्तुओं में मानों को संशोधित कर सकते हैं।

ऊपर थोड़ा गुप्त तो चलो मदों की एक सूची के साथ एक (थोड़ा कृत्रिम) उदाहरण पर विचार करें ध्वनि हो सकता है:

$scope.items = [{name: 'foo', value:0}, {name: 'bar', value:0}, {name: 'baz', value:0}]; 

अब, चलो ऊपर की सूची प्रदर्शित करने के लिए उपयोग एनजी-दोहराएँ जाने और की है कि मान लीजिए किसी आइटम पर क्लिक करने से अन्य आइटमों का मूल्य बढ़ाना चाहिए (एक बार फिर, उदाहरण थोड़ा कृत्रिम है लेकिन यहां बिंदु यह है कि एक गुंजाइश में ट्रिगर की गई कार्रवाई अन्य स्कॉप्स में दुष्प्रभाव हो सकती है)। यह इस तरह से जा सकते हैं:

$scope.incOther = function(item) { 
     for (var i=0; i<$scope.items.length; i++){ 
      if ($scope.items[i] !== item){ 
       $scope.items[i].value++; 
      } 
     } 
    }; 

उदाहरण समारोह अन्य कार्यक्षेत्रों और AngularJS में मूल्यों को संशोधित करेगा - सही परिणाम प्रदर्शित करने के लिए - माता पिता कार्यक्षेत्रों में पर नजर रखने वालों ($ rootScope अप करने के लिए मूल्यांकन करने के लिए की जरूरत है क्योंकि हम जहां पता नहीं है एक वस्तु परिभाषित किया गया था)।

यहाँ पूरा jsFiddle इस illustrating है: http://jsfiddle.net/pkozlowski_opensource/Z6e5g/3/

वास्तव में jsFiddle ऊपर भी एक $ rootScope में एक वस्तु है कि पर नजर रखने वालों मूल्यांकन वास्तव में बहुत शीर्ष पर शुरू करने के लिए की जरूरत है वर्णन करने के लिए भी शामिल है।

+0

धन्यवाद। आप निश्चित रूप से सही हैं। मैं भूल गया था कि मैं ऑब्जेक्ट के मानों को मूल स्कॉप्स में बदल सकता हूं क्योंकि मैं $ parent.obj, $ parent. $ parent.obj इत्यादि का उपयोग करके भी पूरी वस्तु को बदल सकता हूं। –

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