Вызов ngZone.runTask в ngZone.runOutsideAngular по-прежнему вызывает обнаружение изменений в других компонентах

Я пытаюсь запустить задачу через 3 секунды, используя setTimeout в Angular, но я пытаюсь сделать это, не вызывая обнаружение изменений во всем приложении.

Я попытался запустить setTimeout вне зоны Angular и повторно войти в зону, чтобы запустить задачу обратного вызова 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

Я ожидаю, что пока я запускаю setTimeout вне зоны Angular, он не должен вызывать обнаружение изменений. Я хочу активировать обнаружение изменений только при достижении задач внутри setTimeout, чтобы я мог сохранить обнаружение изменений внутри компонента, а не во всех компонентах приложения. Однако в настоящее время, как только я снова вхожу в зону Angular, он запускает обнаружение изменений и в других компонентах.


person JSDriller    schedule 29.07.2019    source источник


Ответы (1)


this.ngZone.runTask всегда будет запускаться в Angular, в соответствии с обычной стратегией changeDetection. Размещение его в runOutsideAngular этого не меняет.

person Jason Moran    schedule 29.07.2019
comment
Кроме того, прямо из документации Angular: Запуск функций через run позволяет повторно войти в зону Angular из задачи, которая была выполнена за пределами зоны Angular (обычно запускается через runOutsideAngular). Любые будущие задачи или микрозадачи, запланированные из этой функции, будут продолжать выполняться в зоне Angular. - person Jason Moran; 29.07.2019
comment
Я понимаю, что он будет работать в Angular, но почему он вызывает обнаружение изменений во всех компонентах приложения. - person JSDriller; 29.07.2019
comment
Использование ngZone.runTask используется для возврата в контекст Angular и запуска обнаружения изменений. Если вы хотите инициировать обнаружение изменений только для этого компонента, введите ChangeDetectorRef и вручную активируйте его только для этого компонента. - person Jason Moran; 30.07.2019