我今天在我的代码库中看到了以下内容,并试图围绕它可能做的事情:
public ngOnInit(): void {
this.siteTitle = this.modalService.site ? this.modalService.site.siteTitle : null;
setTimeout(() => {
if (!this.modalService.site) {
this.ngZone.run(() => {
this.modalService.close();
});
}
}, 0);
}
我一直在阅读this one等一些文章,但仍希望得到一些澄清。我知道因为setTimeout
参数是0
,它仍然会被放入事件队列中,并在所有其他非JS部分完成后执行。
由于
答案 0 :(得分:3)
我认为您指出的博客是最合适的。
NgZone使我们能够在Angular之外显式运行某些代码 区域,阻止Angular运行任何更改检测。基本上, 处理程序仍将执行,但因为它们不会在内部运行 Angular的区域,Angular将不会收到任务完成的通知 因此不会进行变化检测。我们只想跑 一旦我们释放了正在拖动的框,就会更改检测。
正如您已经指出的那样,您知道为什么使用setTimeout,应该通过再次读取这些行来解决混淆。
他试图使用setTimeOut的原因是因为他想避免错误
ExpressionChangedAfterItHasBeenCheckedError
在角度变化检测完成之前尝试更改变量的值时发生
https://blog.thoughtram.io/angular/2017/02/21/using-zones-in-angular-for-better-performance.html
答案 1 :(得分:0)
我没有写出明确答案的所有信息,但我有时会使用ngZone.run来强制刷新组件。
现在在setTimeout中使用它会让我相信其他地方发生的事情会改变视图的状态,但不知何故需要手动刷新来重绘更改。这通常是一个仅限js的库,使角度不知道的更改。