Предположим, у вас есть родительский компонент A и дочерний компонент B. Компонент A имеет имя и текстовые свойства. В своем шаблоне он использует выражение, которое ссылается на свойство name:
template: '<span>{{name}}</span>'
И он также имеет компонент B в своем шаблоне и передает свойство text этому компоненту через привязку свойства ввода:
@Component({
selector: 'a-comp',
template: `
<span>{{name}}</span>
<b-comp [text]="text"></b-comp>
`
})
export class AComponent {
name = 'I am A component';
text = 'A message for the child component`;
...
}
Итак, вот что происходит, когда Angular запускает обнаружение изменений. Он начинается с проверки компонента A. Первой операцией в списке является обновление привязок, чтобы оно оценивало текстовое выражение как сообщение A для дочернего компонента и передавало его компоненту B. Он также сохраняет это значение в представлении:
view.oldValues[0] = 'A message for the child component';
Затем он вызывает хуки жизненного цикла, упомянутые в списке.
Теперь он выполняет третью операцию и вычисляет выражение {{name}} для текста "Я являюсь компонентом". Он обновляет DOM этим значением и помещает оцененное значение в oldValues:
view.oldValues [1] = 'Я компонент'; Затем Angular выполняет следующую операцию и выполняет ту же проверку для дочернего компонента B. После проверки компонента B текущий цикл дайджеста завершается.
Если Angular работает в режиме разработки, он запускает второй дайджест, выполняя операции проверки, перечисленные выше. Теперь представьте, что каким-то образом текст свойства был обновлен в компоненте A до обновленного текста после того, как Angular передал значение A сообщение для дочернего компонента компоненту B и сохранил его. Теперь он запускает дайджест проверки, и первая операция - проверить, не изменился ли текст свойства:
AComponentView.instance.text === view.oldValues [0]; // false 'Сообщение для дочернего компонента' === 'обновленный текст'; // false Тем не менее, он есть, поэтому Angular выдает ошибку ExpressionChangedAfterItHasBeenCheckedError.
То же самое и с третьей операцией. Если свойство name было обновлено после того, как оно было отображено в DOM и сохранено, мы получим ту же ошибку:
AComponentView.instance.name === view.oldValues [1]; // false 'Я компонент' === 'обновленное имя'; // ложный
поэтому ошибка может быть устранена путем принудительного обнаружения изменений:
ngAfterViewInit() {
this.cd.detectChanges();
}
взято по ссылке: https://indepth.dev/everything-you-need-to-know-about-the-expressionchangedafterithasbeencheckederror-error/
person
Munazzah Asad
schedule
29.06.2020