Что такое 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-зону | Контроль над обновлением интерфейса |