उसके तुम दो उपाय करो!
1. OnDush में ChangeDetectionStrategy को संशोधित करें
इस समाधान के लिए, आप मूल रूप से कोणीय बता रहे हैं:
परिवर्तनों के लिए जाँच बंद करो; मैं इसे केवल तभी करूँगा जब मुझे पता होगा कि यह आवश्यक है
जल्दी ठीक:
अपने घटक को संशोधित करें ताकि इसका उपयोग हो ChangeDetectionStrategy.OnPush
@Component({
selector: 'app-child',
templateUrl: './child.component.html',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class ChildComponent implements OnInit {
// ...
}
इसके साथ, चीजें अब काम नहीं करती हैं। ऐसा इसलिए है क्योंकि अब से आपको detectChanges()
मैन्युअल रूप से कोणीय कॉल करना होगा।
this.cdr.detectChanges();
यहाँ एक लिंक है जिसने मुझे ChangeDetectionStrategy को सही समझने में मदद की :
https://alligator.io/angular/change-detection-strategy/
2. अभिव्यक्ति को समझना
इस त्रुटि के कारणों के बारे में tomonari_t उत्तर से एक छोटा सा उद्धरण है , मैंने केवल उन हिस्सों को शामिल करने की कोशिश की है जिन्होंने मुझे इसे समझने में मदद की।
पूरा लेख यहां दिखाए गए प्रत्येक बिंदु के बारे में वास्तविक कोड उदाहरण दिखाता है।
मूल कारण कोणीय जीवनचक्र है:
प्रत्येक ऑपरेशन के बाद कोणीय को याद है कि ऑपरेशन करने के लिए किन मूल्यों का उपयोग किया जाता है। वे घटक दृश्य के पुरानेवैल्यू गुण में संग्रहीत हैं।
सभी घटकों के लिए जाँच किए जाने के बाद, कोणीय फिर अगला पाचन चक्र शुरू करता है, लेकिन ऑपरेशन करने के बजाय यह वर्तमान मानों की तुलना उन लोगों के साथ करता है जिन्हें यह पिछले पाचन चक्र से याद है।
निम्नलिखित कार्य पाचन चक्र में जाँचे जा रहे हैं:
जाँच करें कि बाल घटकों को दिए गए मान वही हैं जो इन घटकों के गुणों को अपडेट करने के लिए उपयोग किए जाते हैं।
जाँच करें कि DOM तत्वों को अद्यतन करने के लिए उपयोग किए जाने वाले मान वही हैं जो इन तत्वों को अद्यतन करने के लिए उपयोग किए जाने वाले मान अब समान हैं।
सभी बाल घटकों की जाँच
और इसलिए, त्रुटि को फेंक दिया जाता है जब तुलनात्मक मूल्य भिन्न होते हैं। , ब्लॉगर मैक्स कोर्सेटस्की ने कहा:
अपराधी हमेशा बाल घटक या एक निर्देश है।
और अंत में यहां कुछ वास्तविक दुनिया के नमूने हैं जो आमतौर पर इस त्रुटि का कारण बनते हैं:
- साझा सेवाएँ
- तुल्यकालिक घटना प्रसारण
- गतिशील घटक तात्कालिकता
हर नमूना यहां पाया जा सकता है (प्लंकर), मेरे मामले में समस्या एक गतिशील घटक इंस्टेंटेशन थी।
इसके अलावा, अपने स्वयं के अनुभव से मैं हर किसी को setTimeout
समाधान से बचने के लिए दृढ़ता से सलाह देता हूं, मेरे मामले में "लगभग" अनंत लूप (21 कॉल जो मैं आपको दिखाने के लिए तैयार नहीं हूं कि उन्हें कैसे उत्तेजित करना है) का कारण बना।
मैं हमेशा कोणीय जीवन-चक्र को ध्यान में रखने की सलाह दूंगा ताकि आप इस बात को ध्यान में रख सकें कि जब आप किसी अन्य घटक के मूल्य को संशोधित करते हैं तो वे हर बार कैसे प्रभावित होंगे। इस त्रुटि के साथ कोणीय आपको बता रहा है:
आप शायद इसे गलत तरीके से कर रहे हैं, क्या आप सुनिश्चित हैं कि आप सही हैं?
वही ब्लॉग भी कहता है:
अक्सर, डायनेमिक कंपोनेंट बनाने के लिए सही बदलाव डिटेक्शन हुक का उपयोग करना होता है
मेरे लिए एक छोटा गाइड कोडिंग करते समय कम से कम निम्नलिखित दो बातों पर विचार करना है ( मैं समय के साथ इसे पूरक करने की कोशिश करूंगा ):
- माता-पिता के घटक मानों को बच्चे के घटकों से संशोधित करने से बचें, इसके बजाय: उन्हें इसके माता-पिता से संशोधित करें।
- जब आप का उपयोग करें
@Input
और@Output
निर्देश देते हैं, तब तक lyfecycle परिवर्तनों को ट्रिगर करने से बचने की कोशिश करते हैं जब तक कि घटक पूरी तरह से आरंभिक नहीं हो जाता।
- अनावश्यक कॉल से बचें
this.cdr.detectChanges();
, अधिक त्रुटियों को ट्रिगर कर सकते हैं, विशेषकर तब जब आप बहुत सारे गतिशील डेटा से निपट रहे हों
- जब उपयोग
this.cdr.detectChanges();
अनिवार्य हो तो सुनिश्चित करें कि @Input, @Output, etc
उपयोग किए जा रहे चर ( ) सही पहचान हुक पर भरे / आरंभ किए गए हैं ( OnInit, OnChanges, AfterView, etc
)
- जब संभव हो, छिपाने के बजाय हटा दें , यह बिंदु 3 और 4 से संबंधित है।
भी
यदि आप कोणीय जीवन हुक को पूरी तरह से समझना चाहते हैं, तो मैं आपको आधिकारिक दस्तावेज पढ़ने की सलाह देता हूं: