$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>