debugtypescriptangularCritical
How to manage Angular2 "expression has changed after it was checked" exception when a component property depends on current datetime
Viewed 0 times
managewhencheckedcomponenthasdependswascurrentafterexpression
Problem
My component has styles that depend on current datetime. In my component I've got the following function.
The exact error is the following:
Expression has changed after it was checked. Previous value: 'hsl( 123, 80%, 49%)'. Current value: 'hsl( 123, 80%, 48%)'
I know the exception appear in development mode only at the moment the value is checked. If the checked value is different of the updated value, the exception is thrown.
So I tried to update the current datetime at each lifecycle in the following hook method to prevent the exception:
...but without success.
private fontColor( dto : Dto ) : string {
// date d'exécution du dto
let dtoDate : Date = new Date( dto.LastExecution );
(...)
let color = "hsl( " + hue + ", 80%, " + (maxLigness - lightnessAmp) + "%)";
return color;
}lightnessAmp is calculated from the current datetime. The color changes if dtoDate is in the last 24 hours.The exact error is the following:
Expression has changed after it was checked. Previous value: 'hsl( 123, 80%, 49%)'. Current value: 'hsl( 123, 80%, 48%)'
I know the exception appear in development mode only at the moment the value is checked. If the checked value is different of the updated value, the exception is thrown.
So I tried to update the current datetime at each lifecycle in the following hook method to prevent the exception:
ngAfterViewChecked()
{
console.log( "! changement de la date du composant !" );
this.dateNow = new Date();
}...but without success.
Solution
Run change detection explicitly after the change:
import { ChangeDetectorRef } from '@angular/core';
constructor(private cdRef:ChangeDetectorRef) {}
ngAfterViewChecked()
{
console.log( "! changement de la date du composant !" );
this.dateNow = new Date();
this.cdRef.detectChanges();
}Code Snippets
import { ChangeDetectorRef } from '@angular/core';
constructor(private cdRef:ChangeDetectorRef) {}
ngAfterViewChecked()
{
console.log( "! changement de la date du composant !" );
this.dateNow = new Date();
this.cdRef.detectChanges();
}Context
Stack Overflow Q#39787038, score: 478
Revisions (0)
No revisions yet.