markForCheck и detectChanges
markForCheck и detectChanges - это два метода из ChangeDetectorRef, который является сердцем системы обнаружения изменений в Angular. Оба метода используются для управления обнаружением изменений и обновления представления компонента. Давайте рассмотрим каждый из них подробнее:
-
markForCheck: Метод markForCheck помечает компонент и его дочерние компоненты для проверки изменений при следующей проверке цикла обнаружения изменений. Это означает, что Angular будет перепроверять компонент и его дочерние компоненты, чтобы обнаружить и применить любые изменения данных, которые могли произойти. Однако сама проверка изменений не происходит немедленно после вызова markForCheck. Вместо этого Angular отложит проверку до ближайшего цикла обнаружения изменений.
Пример использования markForCheck:
import { Component, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' @Component({ selector: 'app-example', template: ` <h1>{{ data }}</h1> <button (click)="updateData()">Update Data</button> `, changeDetection: ChangeDetectionStrategy.OnPush }) export class ExampleComponent { data: string constructor(private cdr: ChangeDetectorRef) {} updateData() { this.data = 'Updated Data' this.cdr.markForCheck() } }
В приведенном примере, при клике на кнопку "Update Data", мы обновляем значение
data
и затем вызываем методmarkForCheck
, чтобы сообщить Angular о необходимости проверить компонент на наличие изменений. При следующей проверке цикла обнаружения изменений Angular обнаружит изменения и обновит представление компонента. -
detectChanges: Метод detectChanges явно запускает проверку изменений и обновление представления компонента в текущем цикле обнаружения изменений. Он принудительно применяет любые изменения данных в компоненте и его дочерних компонентах без ожидания следующего цикла обнаружения изменений. Это может быть полезно, если вы хотите обновить представление компонента немедленно, например, в ответ на асинхронные события.
Пример использования detectChanges:
import { Component, ChangeDetectorRef } from '@angular/core' @Component({ selector: 'app-example', template: ` <h1>{{ data }}</h1> <button (click)="updateData()">Update Data</button> ` }) export class ExampleComponent { data: string constructor(private cdr: ChangeDetectorRef) {} updateData() { this.data = 'Updated Data' this.cdr.detectChanges() } }
В этом примере при клике на кнопку "Update Data" мы обновляем значение
data
и затем вызываем методdetectChanges
, чтобы немедленно применить изменения и обновить представление компонента.
В общем, markForCheck и detectChanges оба позволяют управлять обнаружением изменений и обновлением представления в Angular. markForCheck предоставляет более оптимальный способ отложенной проверки изменений, в то время как detectChanges немедленно применяет изменения. Выбор между ними зависит от конкретного случая использования и требований вашего приложения.