Проверяет понимание необходимости принудительного запуска проверки изменений при стратегии OnPush в Angular, когда изменения приходят через ngOnChanges.
Стратегия OnPush в Angular оптимизирует проверку изменений, запуская её только при определённых условиях. Одно из таких условий — изменение входного свойства (input) компонента. Когда родительский компонент передаёт новое значение через @Input, Angular сравнивает ссылку на объект. Если ссылка изменилась (например, создан новый объект или массив), Angular автоматически запускает проверку изменений для этого компонента и его дочерних элементов.
Метод ngOnChanges вызывается именно в этот момент — до начала проверки изменений. Он получает объект SimpleChanges, содержащий предыдущие и текущие значения. Поскольку ngOnChanges срабатывает только при изменении ссылки на входное свойство, это гарантирует, что проверка изменений уже запланирована и будет выполнена. Поэтому дополнительный вызов ChangeDetectorRef.detectChanges() или markForCheck() не требуется.
@Component({
selector: 'app-child',
template: '{{ data.name }}',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class ChildComponent implements OnChanges {
@Input() data: { name: string };
ngOnChanges(changes: SimpleChanges) {
// Здесь уже гарантировано, что проверка изменений будет запущена
console.log('Input changed:', changes['data'].currentValue);
}
}В родительском компоненте при изменении data нужно создавать новый объект, чтобы ссылка изменилась:
this.data = { name: 'New Name' }; // новая ссылкаЕсли же вы мутируете существующий объект (например, this.data.name = 'New'), ссылка останется прежней, и ngOnChanges не вызовется, а проверка изменений не запустится. В таком случае потребуется вручную вызвать markForCheck() или detectChanges().
Принудительный запуск проверки изменений может понадобиться, если вы изменяете внутреннее состояние компонента (не через @Input) или получаете данные асинхронно (например, через setTimeout, Promise или Observable), и эти данные не приходят через входные свойства. В таких ситуациях Angular не знает об изменениях, и нужно явно сообщить ему через ChangeDetectorRef.
При использовании OnPush и изменении входного свойства через новую ссылку принудительный запуск проверки изменений не нужен — Angular сделает это автоматически. Однако важно соблюдать иммутабельность данных и помнить, что мутация объектов или асинхронные обновления требуют ручного управления проверкой изменений.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию