2017-07-19 60 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();

相关问题