डॉक्स से:
पता लगाना (): शून्य
परिवर्तन डिटेक्टर और उसके बच्चों की जाँच करता है।
इसका मतलब है, अगर कोई ऐसा मामला है जहां आपके मॉडल (आपकी कक्षा) के अंदर कोई भी चीज़ बदल गई है, लेकिन उसने दृश्य को प्रतिबिंबित नहीं किया है, तो आपको उन परिवर्तनों का पता लगाने (स्थानीय परिवर्तनों का पता लगाने) और दृश्य को अपडेट करने के लिए कोणीय को सूचित करने की आवश्यकता हो सकती है।
संभावित परिदृश्य हो सकते हैं:
1- चेंज डिटेक्टर को व्यू से अलग कर दिया जाता है (देखें डिटैच )
2- एक अपडेट हुआ है, लेकिन यह एंगुलर जोन के अंदर नहीं है, इसलिए, एंगुलर को इसके बारे में पता नहीं है।
जैसे जब किसी थर्ड पार्टी फंक्शन ने आपके मॉडल को अपडेट किया है और आप उसके बाद व्यू अपडेट करना चाहते हैं।
someFunctionThatIsRunByAThirdPartyCode(){
yourModel.text = "new text";
}
क्योंकि यह कोड एंगुलर ज़ोन (शायद) के बाहर है, इसलिए आपको सबसे अधिक बदलावों का पता लगाने और दृश्य को अपडेट करने के लिए सुनिश्चित करने की आवश्यकता है, इस प्रकार:
myFunction(){
someFunctionThatIsRunByAThirdPartyCode();
// Let's detect the changes that above function made to the model which Angular is not aware of.
this.cd.detectChanges();
}
नोट :
उपरोक्त कार्य करने के अन्य तरीके हैं, दूसरे शब्दों में, उस परिवर्तन को कोणीय परिवर्तन चक्र के अंदर लाने के अन्य तरीके हैं।
** आप उस थर्ड पार्टी फंक्शन को ज़ोन के अंदर लपेट सकते हैं।
myFunction(){
this.zone.run(this.someFunctionThatIsRunByAThirdPartyCode);
}
** आप एक सेट टाइमआउट के अंदर फ़ंक्शन को लपेट सकते हैं:
myFunction(){
setTimeout(this.someFunctionThatIsRunByAThirdPartyCode,0);
}
3- ऐसे मामले भी हैं जहां आप मॉडल change detection cycle
को समाप्त होने के बाद अपडेट करते हैं , जहां उन मामलों में आपको यह भयानक त्रुटि मिलती है:
"जाँच के बाद अभिव्यक्ति बदल गई है";
इसका आम तौर पर मतलब है (Angular2 भाषा से):
मैंने आपके मॉडल में एक परिवर्तन देखा, जो मेरे स्वीकृत तरीकों (घटनाओं, XHR अनुरोधों, सेटटाइमआउट और ...) के कारण हुआ था और फिर मैंने आपके दृश्य को अपडेट करने के लिए अपना परिवर्तन पता लगाया और मैंने इसे समाप्त कर दिया, लेकिन फिर एक और था आपके कोड में फ़ंक्शन जिसने मॉडल को फिर से अपडेट किया और मैं फिर से अपने परिवर्तन का पता लगाना नहीं चाहता, क्योंकि अब AngularJS जैसी कोई गंदी जाँच नहीं है: D और हमें एक तरफ़ा डेटा प्रवाह का उपयोग करना चाहिए!
आप निश्चित रूप से इस त्रुटि के पार आएंगे: पी।
इसे ठीक करने के कुछ तरीके:
1- उचित तरीका : सुनिश्चित करें कि अपडेट परिवर्तन का पता लगाने के चक्र के अंदर है (Angular2 अपडेट एक तरह से प्रवाह है जो एक बार होता है, उसके बाद मॉडल को अपडेट न करें और अपना कोड बेहतर स्थान / समय पर ले जाएं)।
2- आलसी रास्ता : कोणीय 2 को खुश करने के लिए उस अपडेट के बाद पताचेंज () चलाएं, यह निश्चित रूप से सबसे अच्छा तरीका नहीं है, लेकिन जैसा कि आपने पूछा कि संभावित परिदृश्य क्या हैं, यह उनमें से एक है।
इस तरह से आप कह रहे हैं: मुझे पूरी तरह से पता है कि आपने परिवर्तन का पता लगाया है, लेकिन मैं चाहता हूं कि आप इसे फिर से करें क्योंकि मुझे आपके द्वारा जाँच पूरी करने के बाद फ्लाई पर कुछ अपडेट करना था।
3- कोड को अंदर रखें setTimeout
, क्योंकि setTimeout
ज़ोन द्वारा पैच किया गया है और detectChanges
इसके समाप्त होने के बाद चलेगा ।
डॉक्स से
markForCheck() : void
सभी ChangeDetectionStrategy पूर्वजों की जाँच के रूप में चिह्नित करता है।
यह ज्यादातर तब आवश्यक होता है जब आपके घटक का ChangeDetectionStrategy OnPush हो ।
OnPush का अर्थ है कि, यदि इनमें से कोई भी हुआ है, केवल परिवर्तन का पता लगाएं:
1- घटक के @inputs को पूरी तरह से एक नए मूल्य के साथ बदल दिया गया है, या बस डाल दिया जाए, तो @Input संपत्ति का संदर्भ पूरी तरह से बदल गया है।
यदि आपके घटक का ChangeDetectionStrategy OnPush है और फिर आपके पास है:
var obj = {
name:'Milad'
};
और फिर आप इसे अपडेट / म्यूट करते हैं:
obj.name = "a new name";
यह ओब्ज संदर्भ को अपडेट नहीं करेगा , इसलिए परिवर्तन का पता लगाने वाला नहीं है, इसलिए दृश्य अपडेट / म्यूटेशन को प्रतिबिंबित नहीं कर रहा है।
इस मामले में आपको मैन्युअल रूप से एंगुलर को देखने और अपडेट को देखने के लिए बताना होगा (markForCheck);
तो अगर आपने ऐसा किया है:
obj.name = "a new name";
आपको यह करने की आवश्यकता है:
this.cd.markForCheck();
बल्कि, नीचे चलाने के लिए परिवर्तन का पता लगाने का कारण होगा:
obj = {
name:"a new name"
};
जिसने पिछले ओब्ज को पूरी तरह से एक नए के साथ बदल दिया {}
;
2- एक घटना को निकाल दिया गया है, जैसे एक क्लिक या कुछ चीज़ जैसे या किसी भी बच्चे के घटकों ने एक घटना का उत्सर्जन किया है।
जैसे घटनाएँ:
- क्लिक करें
- तनाव के स्थिति में
- सदस्यता कार्यक्रम
- आदि।
तो संक्षेप में:
का प्रयोग करें detectChanges()
जब आप कोणीय के बाद मॉडल को नवीनीकृत किया है यह परिवर्तन का पता लगाने के समाप्त हो गया है, या अद्यतन कोणीय दुनिया में सभी पर नहीं किया गया है यदि।
markForCheck()
यदि आप OnPush का उपयोग कर रहे हैं और आप ChangeDetectionStrategy
कुछ डेटा को बदलकर बाईपास कर रहे हैं या आपने किसी सेटटाइमआउट के अंदर मॉडल को अपडेट किया है, तो इसका उपयोग करें ;