在ngZone.runOutsideAngular中调用ngZone.runTask仍会触发其他组件中的更改检测

时间:2019-07-29 17:58:09

标签: angular zone

我试图使用Angular中的setTimeout在3秒后运行任务,但是我试图在不触发整个应用程序的变更检测的情况下执行任务。

我尝试在Angular区域之外运行setTimeout,然后重新进入区域以运行setTimeout的回调任务。但是,一旦我租用了该区域,它就会触发整个应用程序中的更改检测

我有这个特定的代码:

ngOnInit() {
    this.ngZone.runOutsideAngular(() => {
      setTimeout(() => {
        this.ngZone.runTask(() => {
          console.log("SHOULD NOT TRIGGER CHANGE DETECTION IN OTHER DIRECTIVES");
        });
      }, 3000);
    });
  }

为了更广泛地查看代码,我有一个stackblitz示例: https://stackblitz.com/edit/runoutside-ng-runinside?file=src/app/app.module.ts

我的期望是,只要我在Angular区域之外运行setTimeout,它就不会触发更改检测。我只想在到达setTimeout内的任务时激活更改检测,以便可以将更改检测保留在组件内,而不是整个应用程序组件。但是,目前,一旦我重新进入Angular区域,它也会触发其他组件中的更改检测。

1 个答案:

答案 0 :(得分:0)

this.ngZone.runTask始终将在Angular中运行,但要遵循常规的changeDetection策略。将其放置在runOutsideAngular中不会改变它。