2017-07-19 58 views
1

我有一個錯誤ExpressionChangedAfterItHasBeenCheckedError。 普拉克:http://plnkr.co/edit/XKfHDAzuhjAhVvbQOpsW?p=previewExpressionChangedAfterItHasBeenCheckedError在角V4.3.0

我找到一個解釋:

https://stackoverflow.com/questions/34364880/expression-has-changed-after-it-was-checked 

但餘did't知道我應該怎麼做這個問題的正確的修復沒有ngAfterViewInit的setTimeout的。

問題是與this.message變量。 +與ngAfterViewChecked相同的問題。有沒有BehaviorSubject的修復程序?

+0

使用ChangeDetectorRef就像其中一個答案。 http://plnkr.co/edit/oGWe6zuOHyZVB38M1X3a?p=preview – Alex

+0

請直接將代碼的重要部分添加到問題中,而不僅僅是鏈接到外部資源。 –

回答

1

您正在使用的模板Child組件的message屬性:

@Component({ 
    selector: 'child-cmp', 
    template: ` 
    <div>{{ message }}<input></div>`, 
}) 
export class Child 

角運行更改child成分檢測(檢查),並更新DOM。然後它會記住它用於更新DOM的值。該值將在驗證步驟中用於檢查綁定是否未更改。問題是,你改變在ngAfterViewInit生命週期掛鉤,值和child部件進行檢查後這個鉤子被觸發。所以,當Angular運行驗證組件時,它會注意到該值不同。所以它會拋出錯誤。 Angular需要在檢查和驗證階段之間進行額外的更改檢測。

如果您確實需要更新ngAfterViewInit生命週期掛鉤中的值,則 會異步使用它或運行子組件的更改檢測。兩者都不好。考慮改變應用程序設計。

Everything you need to know about the ExpressionChangedAfterItHasBeenCheckedError error文章,解釋很詳細的錯誤的原因和可能的解決方法。

+0

非常好的文章)謝謝)) –

0

需要在所有ngAfterViewChecked類型FUNC添加this.ref.detectChanges();

相關問題