[Обновление] https://netbasal.com/reduce-change-detection-cycles-with-event-coalescing-in-angular-c4037199859f
platformBrowserDynamic()
.bootstrapModule(AppModule, { ngZoneEventCoalescing: true })
.catch(err => console.error(err));
В угловой структуре нам нужно обнаружить изменения всякий раз, когда происходят изменения на стороне модели вашего компонента. Это должно отразить для обновления представления компонента [Dom-Update] автоматически. Таким образом, выполнение этой работы Angular предоставляет нам Zone.js и обрабатывает каждый цикл обнаружения угловых изменений из коробки.
Угловые прогоны. Обнаружение обнаружения для каждого компонента, пробуя, каждую модель каждый раз менялась. Это приведет к большей проблеме производительности, когда у вас есть много компонентов в вашем угловом приложении, и вы обновляете только модель одного компонента дерева, по умолчанию угловых прогонов обнаружение изменения изменения для всего доступного дерева компонентов, и это большая проблема производительности. [Позже мы видим, как обновить эту стратегию по умолчанию].
Одним из основных общих поведений ошибок, которое вы, как разработчик, видите при частоте модели компонента на « expresionChangeDafterithasbeencheckederror ». Итак, что говорит нам об этой ошибке, это просто то, что Angular находится в цикле изменений и после того, как между некоторыми значениями модели изменяются, и довольно сбивает с толку знать, какое значение для обновления для просмотра. [Есть способы решить эту проблему].
Angular использует Zone.js и принимает все ссылки на компоненты в качестве структур данных дерева. Таким образом, должен иметь один родительский компонент, а другие – их дочерний компонент.
В примере кода вы можете получить “Expresionhaschangedafterithasbeencheckederror “. Сначала мы инициализируем Флакторы объект и в ngafterviewinit () Жизненный цикл Крюк Мы пытаемся изменить свойство объектов на ложное. Таким образом, Angular дает ошибку из -за изменений, что что -то изменилось до завершения обновления цикла DOM, и это двусмысленность. Просто эта ошибка исходит, потому что существующее значение обновляется сразу после инициализации.
export class AppComponent {
name = 'Angular';
checkboxes = [{
label : 'Sunday',
checked : true
},{
label : 'Monday',
checked : false
},{
label : 'Tuesday',
checked : false
},{
label : 'Wednesday',
checked : true
},{
label : 'Thursday',
checked : false
},{
label : 'Friday',
checked : true
},{
label : 'Saturday',
checked : true
}];
ngOnInit(){
}
ngAfterViewInit(){
this.changeStatus() // This line cause ExpresionChangedError
}
changeStatus(){
this.checkboxes.map(item => item.checked === false ? item.checked=true : item.checked=false);
}
}
}
Решения по вышеуказанной проблеме
Самое первое и грязное и быстрое решение – использовать
setTimeout ()асинхронный метод.Измените этот код в
ngafterviewinit ()к этому…Применяя выше изменения
setTimeout ()Будет автоматически называть цикл обнаружения угловых изменений для нас.С помощью
Изменен ReateCeectorRefи инъекция с использованием зависимости в конструктор компонента. Это угловой способ сделать изменение, используяDetectChanges ()МетодИзменен. Мы явно говорим, чтобы обнаружить изменение DOM из -за того, что мы изменили модель.
Оригинал: “https://dev.to/gaurangdhorda/change-detection-strategy-in-angular-25mc”