$scope
वस्तु को गंदा करके
कोणीय वस्तुओं array
में द्रष्टाओं की एक सरलता बनाए रखता है $scope
। यदि आप किसी का निरीक्षण करते हैं तो आप $scope
पाएंगे कि इसमें एक array
बुलाया गया है $$watchers
।
प्रत्येक द्रष्टा वह है जो object
अन्य चीजों में शामिल है
- एक अभिव्यक्ति जो द्रष्टा निगरानी कर रहा है। यह सिर्फ एक
attribute
नाम या कुछ और जटिल हो सकता है।
- अभिव्यक्ति का एक अंतिम ज्ञात मूल्य। यह अभिव्यक्ति के वर्तमान गणना मूल्य के खिलाफ जाँच की जा सकती है। यदि मान भिन्न होते हैं, तो द्रष्टा फ़ंक्शन को ट्रिगर करेगा और
$scope
गंदे के रूप में चिह्नित करेगा ।
- एक फ़ंक्शन जिसे यदि द्रष्टा गंदा है तो निष्पादित किया जाएगा।
चौकीदार कैसे परिभाषित होते हैं
AngularJS में एक द्रष्टा को परिभाषित करने के कई अलग-अलग तरीके हैं।
आप स्पष्ट रूप से $watch
एक attribute
पर कर सकते हैं $scope
।
$scope.$watch('person.username', validateUnique);
आप {{}}
अपने टेम्पलेट में एक इंटरपोलेशन रख सकते हैं (वर्तमान पर आपके लिए एक चौकीदार बनाया जाएगा $scope
)।
<p>username: {{person.username}}</p>
आप एक निर्देश पूछ सकते हैं जैसे ng-model
आपके लिए चौकीदार को परिभाषित करना।
<input ng-model="person.username" />
$digest
चक्र उनके अंतिम मान के खिलाफ सभी पर नजर रखने वालों की जांच करता है
जब हम सामान्य चैनलों (एनजी-मॉडल, एनजी-रिपीट, आदि) के माध्यम से एंगुलरजेएस के साथ बातचीत करते हैं, तो एक पाचन चक्र निर्देश द्वारा ट्रिगर किया जाएगा।
एक पाचन चक्र गहराई $scope
और उसके सभी बच्चों का पहला लक्षण है । प्रत्येक के लिए $scope
object
, हम इसके बारे में पुनरावृति करते हैं $$watchers
array
और सभी अभिव्यक्तियों का मूल्यांकन करते हैं। यदि नई अभिव्यक्ति का मान पिछले ज्ञात मूल्य से अलग है, तो वॉचर्स फ़ंक्शन को कहा जाता है। यह फ़ंक्शन DOM के भाग को फिर से शुरू कर सकता है, एक मान को फिर से शुरू कर सकता है, एक $scope
ट्रिगर कर सकता है AJAX
request
, कुछ भी आपको इसकी आवश्यकता है।
हर गुंजाइश का पता लगाया जाता है और हर घड़ी अभिव्यक्ति का मूल्यांकन किया जाता है और अंतिम मूल्य के खिलाफ जांच की जाती है।
यदि एक द्रष्टा ट्रिगर है, $scope
गंदा है
यदि एक द्रष्टा को ट्रिगर किया जाता है, तो ऐप जानता है कि कुछ बदल गया है, और इसे $scope
गंदे के रूप में चिह्नित किया गया है।
वॉचर फ़ंक्शंस $scope
माता-पिता पर या अन्य विशेषताओं को बदल सकते हैं $scope
। यदि एक $watcher
फ़ंक्शन को ट्रिगर किया गया है, तो हम गारंटी नहीं दे सकते कि हमारे अन्य $scope
एस अभी भी साफ हैं, और इसलिए हम पूरे पाचन चक्र को फिर से निष्पादित करते हैं।
ऐसा इसलिए है क्योंकि AngularJS में दो-तरफ़ा बाइंडिंग है, इसलिए डेटा को $scope
ट्री के ऊपर वापस भेजा जा सकता है । हम $scope
पहले से पच चुके उच्च पर मान बदल सकते हैं । शायद हम एक मान को बदलते हैं $rootScope
।
यदि $digest
गंदा है, तो हम पूरे $digest
चक्र को फिर से निष्पादित करते हैं
हम लगातार $digest
चक्र के माध्यम से लूप करते हैं जब तक या तो पाचन चक्र साफ नहीं हो जाता है (सभी $watch
अभिव्यक्तियों का समान मूल्य है जैसा कि पिछले चक्र में था), या हम पाचन सीमा तक पहुंचते हैं। डिफ़ॉल्ट रूप से, यह सीमा 10 पर निर्धारित है।
अगर हम डाइजेस्ट लिमिट तक पहुँच जाते हैं तो AngularJS कंसोल में एक त्रुटि उत्पन्न करेगा:
10 $digest() iterations reached. Aborting!
पचाने की मशीन पर मुश्किल है लेकिन डेवलपर पर आसान है
जैसा कि आप देख सकते हैं, हर बार कुछ परिवर्तन एक AngularJS ऐप में होता है, AngularJS $scope
पदानुक्रम में हर एक चौकीदार की जांच करेगा कि कैसे प्रतिक्रिया दें। एक डेवलपर के लिए यह एक बड़े पैमाने पर उत्पादकता वाला वरदान है, क्योंकि अब आपको लगभग कोई वायरिंग कोड लिखने की आवश्यकता नहीं है, AngularJS सिर्फ नोटिस करेगा यदि कोई मूल्य बदल गया है, और बाकी ऐप को बदलाव के अनुरूप बना दें।
मशीन के दृष्टिकोण से हालांकि यह बेतहाशा अक्षम है और अगर हम बहुत सारे वॉचर्स बनाते हैं तो यह हमारे ऐप को धीमा कर देगा। मिसको ने लगभग 4000 वॉचर्स का एक आंकड़ा उद्धृत किया है इससे पहले कि आपका ऐप पुराने ब्राउज़रों पर धीमा महसूस करेगा।
उदाहरण के लिए यदि आप ng-repeat
बड़े पैमाने पर पहुँचते हैं तो यह सीमा आसान है JSON
array
। आप वॉचर्स बनाए बिना किसी टेम्पलेट को संकलित करने के लिए वन-टाइम बाइंडिंग जैसी सुविधाओं का उपयोग करके इसके खिलाफ कम कर सकते हैं।
बहुत सारे चौकीदार बनाने से कैसे बचें
जब भी आपका उपयोगकर्ता आपके ऐप के साथ इंटरैक्ट करता है, तो आपके ऐप के हर एक चौकीदार का मूल्यांकन कम से कम एक बार किया जाएगा। AngularJS ऐप को अनुकूलित करने का एक बड़ा हिस्सा आपके $scope
पेड़ में देखने वालों की संख्या को कम कर रहा है । ऐसा करने का एक आसान तरीका एक समय बंधन के साथ है ।
यदि आपके पास डेटा है जो शायद ही कभी बदलेगा, तो आप इसे केवल एक बार :: सिंटैक्स का उपयोग करके बाँध सकते हैं, जैसे:
<p>{{::person.username}}</p>
या
<p ng-bind="::person.username"></p>
बंधन केवल ट्रिगर किया जाएगा जब युक्त टेम्पलेट प्रदान किया गया है और डेटा लोड किया गया है $scope
।
यह विशेष रूप से महत्वपूर्ण है जब आपके पास ng-repeat
कई आइटम हों।
<div ng-repeat="person in people track by username">
{{::person.username}}
</div>