在Angular中设置超时和NgZone

时间:2017-11-17 15:17:02

标签: javascript angular

我今天在我的代码库中看到了以下内容,并试图围绕它可能做的事情:

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部分完成后执行。

由于

2 个答案:

答案 0 :(得分:3)

我认为您指出的博客是最合适的。

  

NgZone使我们能够在Angular之外显式运行某些代码   区域,阻止Angular运行任何更改检测。基本上,   处理程序仍将执行,但因为它们不会在内部运行   Angular的区域,Angular将不会收到任务完成的通知   因此不会进行变化检测。我们只想跑   一旦我们释放了正在拖动的框,就会更改检测。

正如您已经指出的那样,您知道为什么使用setTimeout,应该通过再次读取这些行来解决混淆。

他试图使用setTimeOut的原因是因为他想避免错误

  

ExpressionChangedAfterItHasBeenCheckedError

在角度变化检测完成之前尝试更改变量的值时发生

点数 - https://blog.angularindepth.com/everything-you-need-to-know-about-the-expressionchangedafterithasbeencheckederror-error-e3fd9ce7dbb4

https://blog.thoughtram.io/angular/2017/02/21/using-zones-in-angular-for-better-performance.html

答案 1 :(得分:0)

我没有写出明确答案的所有信息,但我有时会使用ngZone.run来强制刷新组件。

现在在setTimeout中使用它会让我相信其他地方发生的事情会改变视图的状态,但不知何故需要手动刷新来重绘更改。这通常是一个仅限js的库,使角度不知道的更改。