我有以下设计:
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;。
并使用了描述的setTimeout(),现在错误消失了。这到底发生了什么?
setTimeout究竟在做什么。官方解释是&#34; setTimeout函数调度&#34; macrotask&#34;这将在以下VM转弯中执行&#34;。
那么setTimetout会延迟定义函数的执行,直到下一个更改检测周期?什么是&#34;下一个VM转向&#34;?
答案 0 :(得分:2)
通过使用SetTimeout,您基本上可以将流程的一部分分支到新的更改检测周期。完成任务后会发生的那个。
您看到的错误基本上是来自Angular的防御机制,以防止多个源在同一个更改检测周期中多次更新同一属性。如果允许这样做,那么弄清楚显示的最终值以及生成它的人是非常棘手的。
这就是您不再看到错误的原因,因为在同一个更改检测周期中将不再进行多项更改。你正在拥有将它们分成不同时间的所有权,因此Angular对此很好