Что такое NgZone в Angular?
NgZone — это сервис в Angular, который используется для управления зонами выполнения (execution context) и запуска change detection (обнаружения изменений). Он основан на библиотеке zone.js и позволяет Angular отслеживать все асинхронные операции, такие как setTimeout, Promise, XHR и т.д.
Зачем нужен NgZone?
Angular использует NgZone, чтобы:
- автоматически запускать детектирование изменений после завершения асинхронных операций;
- отслеживать внешние события (например, click,HTTP,setTimeout);
- позволить оптимизировать производительность, управляя вручную запуском change detection.
Как работает NgZone
Когда происходит асинхронное событие (например, setTimeout, fetch, input), Angular автоматически:
- Заходит в NgZone;
- Выполняет асинхронную задачу;
- После завершения — вызывает Change Detectionдля обновления UI.
Пример
import { Component, NgZone } from '@angular/core';
@Component({
  selector: 'app-zone-demo',
  template: `<p>{{progress}}%</p>`
})
export class ZoneDemoComponent {
  progress = 0;
  constructor(private ngZone: NgZone) {}
  startProgress() {
    this.progress = 0;
    this.increaseProgress();
  }
  // Без выхода из зоны — будет вызывать change detection каждый шаг
  increaseProgress() {
    if (this.progress < 100) {
      setTimeout(() => {
        this.progress += 1;
        this.increaseProgress();
      }, 10);
    }
  }
}
А если выйти из зоны?
Иногда вам не нужно вызывать change detection слишком часто. В этом случае можно использовать runOutsideAngular():
this.ngZone.runOutsideAngular(() => {
  this.progress = 0;
  const timer = setInterval(() => {
    this.progress += 1;
    if (this.progress >= 100) {
      clearInterval(timer);
      // Вернуться обратно в Angular-зону, чтобы обновить UI
      this.ngZone.run(() => {
        console.log("Завершено!");
      });
    }
  }, 10);
});
- runOutsideAngular()— запускает код вне зоны Angular, так что change detection не триггерится каждый раз.
- run()— вручную возвращаемся в Angular-контекст и инициируем обновление UI.
Вывод
| Что делает NgZone? | Преимущества | 
|---|---|
| Отслеживает асинхронные операции | Автоматическое обновление UI | 
| Запускает Change Detection | Удобно при взаимодействии с DOM | 
| Позволяет выйти из зоны ( runOutsideAngular) | Повышение производительности | 
| Позволяет вручную вернуться в Angular-зону | Контроль над обновлением интерфейса |