दिलचस्प पोस्ट
Mac पर आर स्थापित करना – चेतावनी संदेश: LC_CTYPE सेट करना विफल, "सी" का उपयोग करना PHP – अपलोड करें utf-8 फ़ाइल नाम स्काला में एक अभिव्यक्ति के रूप में सुधार (एक एएसटी प्राप्त करें) का उपयोग करने का सबसे आसान तरीका क्या है? शून्य सूचक को पूर्णांक कैसे डालना है? पायथन में प्रोग्राम या एनिमेटेड जीआईआईफ़ उत्पन्न करते हैं? स्ट्रिंग में प्रत्येक शब्द के पहले अक्षर को कैपिटल कैसे करें क्या <स्क्रिप्ट> टैग स्वयं बंद नहीं किया जा सकता है? ClearCase: एक विशिष्ट निर्देशिका के पुराने संस्करण लोड हो रहा है? PHPExcel वर्ग Zend Autoloader में नहीं मिला अगर एक MySQL क्वेरी में ELSE कथन I यूनिट परीक्षण में सूचियों की तुलना कैसे करें मेरी वापसी शून्य क्यों है, लेकिन अगर मैं क्रोम / सफारी में यूआरएल दबाता हूं, तो मुझे डाटा मिल सकता है? SqlBulkCopy पहचान कॉलम के साथ डालें मैं एक वेक्टर में किसी आइटम का सूचक कैसे प्राप्त करूं? समुच्चय और पीओडी और कैसे / क्यों वे विशेष हैं?

अभिव्यक्ति ___ की जांच के बाद यह बदल गया है

इस सरल खंड में घटक क्यों है?

@Component({ selector: 'my-app', template: `<div>I'm {{message}} </div>`, }) export class App { message:string = 'loading :('; ngAfterViewInit() { this.updateMessage(); } updateMessage(){ this.message = 'all done loading :)' } } 

फेंक:

अपवाद: अभिव्यक्ति 'I {{message}} में ऐप @ 0: 5' की जांच के बाद बदल गया है। पिछला मान: 'मैं लोड कर रहा हूं :('। वर्तमान मूल्य: 'मैं सब कुछ लोड हो रहा हूं :)' में [मैं {{message}} में ऐप @ 0: 5 में हूं

जब मैं देख रहा हूं कि मेरे विचार की शुरूआत करते समय एक साधारण बाध्यकारी अद्यतन हो रहा है?

Solutions Collecting From Web of "अभिव्यक्ति ___ की जांच के बाद यह बदल गया है"

जैसा कि ड्यूरेउओर ने कहा है, इस मामले में उचित समाधान वर्तमान घटक के लिए मैन्युअल रूप से बदलाव का पता लगाने के लिए है। यह ChangeDetectorRef ऑब्जेक्ट ( angular2/core से आयातित), या इसके markForCheck() विधि की ChangeDetectorRef विधि का उपयोग करके किया जाता है, जो किसी भी मूल घटक अद्यतन भी करता है। प्रासंगिक उदाहरण :

 import { Component, ChangeDetectorRef } from 'angular2/core' @Component({ selector: 'my-app', template: `<div>I'm {{message}} </div>`, }) export class App { message: string = 'loading :('; constructor(private cdr: ChangeDetectorRef) {} ngAfterViewInit() { this.message = 'all done loading :)' this.cdr.detectChanges(); } } 

यहाँ भी plunkers ngOnInit , setTimeout का प्रदर्शन है, और सक्षम Prododox दृष्टिकोण सिर्फ मामले में।

सबसे पहले, ध्यान दें कि इस अपवाद को केवल तब ही फेंक दिया जाएगा जब आप अपने ऐप को देव मोड में चला रहे हों (जो कि बीटा -0 के रूप में डिफ़ॉल्ट रूप से मामला है): यदि आप एप को बूटस्ट्रैप करते समय enableProdMode() कॉल करते हैं, तो यह नहीं मिलेगा फेंक दिया ( अद्यतन plunk देखें )।

दूसरा, ऐसा मत करो क्योंकि यह अपवाद अच्छे कारणों के लिए फेंक दिया जा रहा है: संक्षेप में, जब देव मोड में, प्रत्येक दौर के परिवर्तन का पता तुरंत दूसरे दौर के बाद किया जाता है जो पुष्टि करता है कि पहले के अंत से कोई बाइंडिंग बदल नहीं पाई है, क्योंकि इससे संकेत मिलता है कि परिवर्तन का पता लगाने के कारण ही बदलाव किए जा रहे हैं।

आपके प्लंकेट में, बाध्यकारी {{message}} को आपके कॉल से setMessage() करने के लिए setMessage() बदल दिया जाता है, जो ngAfterViewInit हुक में होता है, जो प्रारंभिक परिवर्तन का पता लगाने के मोड़ के रूप में होता है हालांकि, समस्या यह है कि setMessage() बाध्यकारी परिवर्तन करता है, लेकिन एक नया दौर परिवर्तन पहचान को ट्रिगर नहीं करता है, जिसका अर्थ है कि इस परिवर्तन को तब तक नहीं खोजा जाएगा जब तक कि भविष्य के किसी भी दौर में परिवर्तन का पता लगाया जा रहा है कहीं और नहीं ।

ख़तरेदार: किसी भी चीज में बाध्यकारी बदलावों को बदलता है, जब यह परिवर्तन के दौर को ट्रिगर करता है।

यह कैसे करें कि एक उदाहरण के लिए सभी अनुरोधों के जवाब में अद्यतन : @ टाइको का समाधान काम करता है, जैसा कि उत्तर में तीन तरीकों @ मार्कराजकोक ने बताया लेकिन स्पष्ट रूप से, वे सभी मुझे बदसूरत और गलत महसूस करते हैं, जैसे हम एनजी 1 में झुकाव करते थे।

यह सुनिश्चित करने के लिए, कभी-कभी ऐसे परिस्थितियां होती हैं जहां ये हैक्स उपयुक्त हैं, लेकिन यदि आप उन्हें बहुत ही कभी-कभी आधार से अधिक कुछ का उपयोग कर रहे हैं, तो यह एक संकेत है कि आप पूरी तरह से अपने प्रतिक्रियाशील प्रकृति को गले लगाने की बजाय फ्रेमवर्क से लड़ रहे हैं।

आईएमएचओ, एक और मुहावरेदार, "एंग्वलर 2 रास्ता" इस पर पहुंचने का है: ( प्लंक )

 @Component({ selector: 'my-app', template: `<div>I'm {{message | async}} </div>` }) export class App { message:Subject<string> = new BehaviorSubject('loading :('); ngAfterViewInit() { this.message.next('all done loading :)') } } 

क्या आप ngOnInit उपयोग नहीं कर सकते क्योंकि आप केवल सदस्य चर message बदल रहे हैं?

यदि आप बाल घटक @ViewChild(ChildComponent) संदर्भ को एक्सेस करना चाहते हैं, तो आपको वास्तव में इसके लिए ngAfterViewInit साथ इंतजार करना ngAfterViewInit

एक गंदे फिक्स अगली इवेंट लूप में updateMessage() को कॉल करना है, updateMessage() कि updateMessage()

 ngAfterViewInit() { setTimeout(() => { this.updateMessage(); }, 1); } 

मैंने इसे ChangeDetectionStrategy को कोणीय कोर से जोड़कर तय किया है।

 import { Component, ChangeDetectionStrategy } from '@angular/core'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'page1', templateUrl: 'page1.html', }) 

इस लेख को आपको ExpressionChangedAfterItHasBeenCheckedError बारे में जानने की ज़रूरत है, ExpressionChangedAfterItHasBeenCheckedError हुए ExpressionChangedAfterItHasBeenCheckedError त्रुटि महान विवरण में व्यवहार बताती है।

आपके साथ समस्या यह है कि ngAfterViewInit जीवनचक्र हुक को निष्पादित करने के बाद डीओएम अद्यतन संसाधित किया गया है। और आप इस हुक में टेम्प्लेट में उपयोग की जाने वाली संपत्ति को प्रभावी ढंग से बदल रहे हैं जिसका अर्थ है कि डोम को पुन: प्रस्तुत करने की आवश्यकता है:

  ngAfterViewInit() { this.message = 'all done loading :)'; // needs to be rendered the DOM } 

और इसके लिए डिज़ाइन द्वारा एक और परिवर्तन का पता लगाने चक्र और कोणीय की आवश्यकता होगी केवल एक डायजेस्ट चक्र चलाता है

आपके पास मूल रूप से दो विकल्प हैं जिन्हें इसे ठीक करना है:

  • अतुल्यकालिक संपत्ति को अद्यतन करें, या तो setTimeout , Promise.then या टेम्पलेट में संदर्भित अतुल्यकालिक अवलोकन

  • DOM अद्यतन से पहले हुक में प्रॉपर्टी अपडेट करें – ngOnInit, ngDoCheck, ngAfterContentInit, ngAfterContentChecked

आप ngOnInt () – विधि में मेसेज () को अपडेट करने के लिए कॉल भी डाल सकते हैं, कम से कम यह मेरे लिए काम करता है

 ngOnInit() { this.updateMessage(); } 

आरसी 1 में यह अपवाद ट्रिगर नहीं करता है

आपको सिर्फ अपने संदेश को सही जीवनचक्र हुक में अपडेट करना होगा, इस मामले में ngAfterContentChecked बदले ngAfterViewInit कंटेंट चेक किया गया है, क्योंकि एनजीएफ़्टर वीवइंट में चर संदेश के लिए एक चेक शुरू किया गया है, लेकिन अभी तक समाप्त नहीं हुआ है।

देखें: https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html#!#afterview

इसलिए कोड बस होगा:

 import { Component } from 'angular2/core' @Component({ selector: 'my-app', template: `<div>I'm {{message}} </div>`, }) export class App { message: string = 'loading :('; ngAfterContentChecked() { this.message = 'all done loading :)' } } 

प्लंकर पर काम कर रहे डेमो देखें

यह एक त्रुटि डालता है क्योंकि आपके कोड को अपडेट किया जाता है जब ngAfterViewInit () कहा जाता है। जब आपके एनजीएफ़टरविवेइन्थ के स्थान पर आरंभिक मान को बदल दिया गया है, तो यदि आप इसे ngAfterContentInit () में कहते हैं तो यह एक त्रुटि नहीं फेंक देगा।

 ngAfterContentInit() { this.updateMessage(); } 

ngAfterViewChecked () मेरे लिए काम किया:

 import { Component, ChangeDetectorRef } from '@angular/core'; //import ChangeDetectorRef constructor(private cdr: ChangeDetectorRef) { } ngAfterViewChecked(){ //your code to update the model this.cdr.detectchanges } 

आप आरएक्सजेएस अवलोकन के साथ टाइमर भी बना सकते हैं और फिर अपनी सदस्यता => में संदेश अपडेट कर सकते हैं

Observable.timer (1)। सदस्यता लें (() => this.updateMessage ());