ExpressionChangedAfterItHasBeenCheckedError原因

时间:2017-12-07 21:58:06

标签: angular

我有以下设计:

Parent
+ Child 1
  + Child 2

Child 2包含和输入字段,用户点击ENTER并发出一个事件。子1拦截它并发出一个由父进行拦截的执行事件。 Parent执行搜索并通过Input()将结果发送回Child 1。

在一种情况下,当用户使用reload = Y标志导航到Parent时,将根据先前保存的标准自动运行搜索。我在ngOnInit中通过检查路由params reload = Y然后发出相同的执行事件来执行此操作,它转到父级并且结果通过Input()返回,这是有效的但是我也在控制台中得到此错误 - < / p>

ExpressionChangedAfterItHasBeenCheckedError:表达式在检查后发生了变化。以前的值:&#39; undefined&#39;。当前值:&#39; [对象对象]&#39;。

我遵循了这篇文章: https://blog.angularindepth.com/everything-you-need-to-know-about-the-expressionchangedafterithasbeencheckederror-error-e3fd9ce7dbb4

并使用了描述的setTimeout(),现在错误消失了。这到底发生了什么?

setTimeout究竟在做什么。官方解释是&#34; setTimeout函数调度&#34; macrotask&#34;这将在以下VM转弯中执行&#34;。

那么setTimetout会延迟定义函数的执行,直到下一个更改检测周期?什么是&#34;下一个VM转向&#34;?

1 个答案:

答案 0 :(得分:2)

通过使用SetTimeout,您基本上可以将流程的一部分分支到新的更改检测周期。完成任务后会发生的那个。

您看到的错误基本上是来自Angular的防御机制,以防止多个源在同一个更改检测周期中多次更新同一属性。如果允许这样做,那么弄清楚显示的最终值以及生成它的人是非常棘手的。

这就是您不再看到错误的原因,因为在同一个更改检测周期中将不再进行多项更改。你正在拥有将它们分成不同时间的所有权,因此Angular对此很好