$ $ बनाम बनाम डाइजेस्टिव टेस्टिंग में


98

यदि मेरे पास एक निर्देश है जो दायरे पर किसी विशेष विशेषता की स्थिति पर प्रतिक्रिया करता है, और मैं अपने परीक्षण में उस विशेषता को बदलना चाहता हूं और सत्यापित करता हूं कि यह सही तरीके से प्रतिक्रिया करता है, तो उस परिवर्तन को करने का सबसे अच्छा तरीका क्या है?

मैंने ये दोनों पैटर्न देखे हैं:

scope.$apply(function() {
    scope.myAttribute = true;
});

तथा

scope.myAttribute = true;
scope.$digest();

उनमें क्या अंतर है, और कौन सा बेहतर है और क्यों?

जवाबों:


206

scope.$digest()मौजूदा दायरे में और इसके सभी बच्चों पर भी नजर रखेगा। scope.$applyपारित समारोह का मूल्यांकन करेगा और चलाएगा $rootScope.$digest()

पहले वाला तेज है, क्योंकि उसे वर्तमान क्षेत्र और उसके बच्चों के लिए दर्शकों का मूल्यांकन करने की आवश्यकता है। दूसरा सबसे धीमा है, क्योंकि इसके लिए $rootScopeसभी बच्चों को देखने की जरूरत है।

जब वॉचर्स में से एक में कोई त्रुटि होती है और आप उपयोग करते हैं scope.$digest, तो इसे $exceptionHandlerसेवा के माध्यम से नियंत्रित नहीं किया जाता है, इसलिए आपको स्वयं अपवाद को संभालने की आवश्यकता है। आंतरिक रूप से scope.$applyएक try-catchब्लॉक का उपयोग करता है और सभी अपवादों को पास करता है $exceptionHandler


1
क्या $digestस्कोप के बच्चों को भी बुलाया जाएगा?
पिलाऊ

15
यह भ्रामक हो सकता है। $digestकेवल मौजूदा दायरे में ही नहीं, बल्कि इसके सभी बच्चों पर भी नजर रखता है।
tasseKATT

@tasseKATT, मुझे लगता है कि मैंने उस पर कब्जा कर लिया है जो आपकी टिप्पणी का सुझाव दे रहा है।
एक्टिवाडेक्

12

जैसे ही प्रलेखन में $ डाइजेस्ट चक्र का उल्लेख होता है, आप किसी भी समय करते हैं $scope.$applyस्कोप पर डेवलपर गाइड के अनुसार

अभिव्यक्ति का मूल्यांकन करने के बाद, $ लागू पद्धति $ डाइजेस्ट करती है। $ डाइजेस्ट फेज में स्कोप $ वॉच के सभी भावों की जांच करता है और पिछले मूल्य के साथ उनकी तुलना करता है।

और स्कोप एपीआई प्रलेखन के अनुसार

आमतौर पर आप $ डाइजेस्ट () को सीधे नियंत्रकों या निर्देशों में नहीं कहते हैं। $ कॉल लागू करने के बजाय () (आमतौर पर निर्देशों के भीतर से) $ पचाने को बाध्य करेगा ()।

तो आपको स्पष्ट रूप से कॉल नहीं करना चाहिए $digest, आप कॉलिंग $applyविधि एक पाचन चक्र को ट्रिगर करेंगे।


8
यह सच नहीं है क्योंकि ज्यादातर मामलों में पाचन पर्याप्त होता है, जहां केवल वर्तमान गुंजाइश और उसके बच्चों का मूल्यांकन करने की आवश्यकता होती है। यह सच है कि $ गुंजाइश। $ लागू कॉल $ डाइजेस्ट को आंतरिक रूप से याद करते हैं, लेकिन यह याद रखना बहुत महत्वपूर्ण है कि यह $ $ कॉल को समाप्त कर देगा। स्कोप। $ डाइजेस्ट () और इसलिए बहुत भारी
श्रीवत्स हरीश वेंकटरमण
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.