NgZone — это сервис в Angular, который предоставляет механизм для отслеживания и управления выполнением кода внутри и вне зоны Angular (Zone.js). Это ключевой элемент системы обнаружения изменений.
Zone.js monkey-patches асинхронные API браузера (setTimeout, Promise, addEventListener и др.), создавая контекст выполнения (зону), который позволяет отслеживать завершение асинхронных операций.
// Без Zone.js
setTimeout(() => {
console.log('Timeout finished');
}, 1000);
// С Zone.js - зона знает, когда таймер завершится
Автоматическое обнаружение изменений
Когда код выполняется внутри зоны Angular, фреймворк автоматически запускает проверку изменений после асинхронных операций.
Две зоны выполнения:
constructor(private ngZone: NgZone) {}
runInsideAngular() {
this.ngZone.run(() => {
// Этот код вызовет обнаружение изменений
setTimeout(() => this.value = 'Updated', 1000);
});
}
runOutsideAngular() {
this.ngZone.runOutsideAngular(() => {
// Этот код НЕ вызовет обнаружение изменений
setTimeout(() => console.log('Done'), 1000);
});
}
this.ngZone.runOutsideAngular(() => {
heavyCalculation(); // Не триггерит проверку изменений
});
this.ngZone.run(() => {
// Явно запускаем обнаружение после этой операции
this.updateView();
});
NgZone предоставляет Observable для отслеживания состояния:
this.ngZone.onStable.subscribe(() => {
console.log('Zone is stable');
});
Пример оптимизации рендеринга большого количества элементов:
this.ngZone.runOutsideAngular(() => {
// Сначала создаем элементы без проверки изменений
this.createThousandItems();
// Затем вручную запускаем обнаружение
this.ngZone.run(() => this.cdRef.detectChanges());
});
NgZone — это обертка вокруг Zone.js, которая позволяет Angular автоматически отслеживать асинхронные операции и запускать механизм обнаружения изменений. Она разделяет выполнение кода на "внутри Angular" и "вне Angular" для оптимизации производительности. Правильное использование NgZone помогает избежать лишних проверок изменений и улучшает производительность приложения.