Link

ExpressionChangedAfterItHasBeenCheckedError

Este es el famoso error que siempre sale y nunca consigo arreglarlo.

ERROR Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'null: [
  {

Que significa este error

(Yo creo que significa:) Que estoy cambiando las propiedades de un objeto mucho mas ‘rapido’ de lo que angular es capaz de verificarlo.

Por asi decirloe stoy cambiando la propiedad de un objeto (ejemplo un boolean) de true a false y luego otra vez a true, todo seguido sin dejar tiempo a angular o a que los componentes hijos de angular se enteren de este cambio

Solucion

La solucion que he ecnontrado a este problem viene de la mano de ChangeDetector de angular.

Ejemplo de solucion:

app.component.html

<app1>
	<app2
		[input]="input"
    >
    <app2/>
<app1>

app2.component.html

<ng-container *ngIf="input">
	hola
<ng-container/>
<ng-container *ngIf="!input">\
	adios
<ng-container/>

Hay que imaginar que en app.component hay funciones que estan cambiando el valor de input .

Si alguna vez el valor de input cambia muy rapido el componente hijo app2 tambien se tendra que actualizar y entonces saltara el siguiente error ExpressionChangedAfterItHasBeenCheckedError

Solucion

Si el error te lleva a una parte concreta del ts mejor si no hay que revisar donde puede cambiar el valor de input y añadir esta linea

this.cd.detectChanges(); (cd === protected cd: ChangeDetectorRef).

Donde cd esta definido en el constructor de app.component.ts.

Esto se tiene que hacer en el componente padre, que es el que esta cambiando el valor de input

Links a leer sobre este tema

Que es el error ExpressionChangedAfterItHasBeenCheckedError y como solucionarlo

Entiendiendo la deteccion de cambios

Solucion 2

https://blog.angular-university.io/angular-debugging/