Мой компонент имеет стили, которые зависят от текущего времени и времени. В моем компоненте у меня есть следующая функция.Как управлять выражением Angular2 «изменилось после проверки» Исключение, когда свойство компонента зависит от текущего datetime
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
вычисляется из текущей даты-времени. Цвет меняется, если dtoDate
находится за последние 24 часа.
Точная ошибка заключается в следующем:
Expression has changed after it was checked. Previous value:
'hsl(123, 80%, 49%)'. Current value: 'hsl(123, 80%, 48%)'
Я знаю, что исключение появляется в режиме разработки только в данный момент проверяется значение. Если проверенное значение отличается от обновленного значения, генерируется исключение.
Так что я пытался обновить текущий DateTime на каждом жизненном цикле в следующем методе крючками, чтобы предотвратить исключение:
ngAfterViewChecked()
{
console.log("! changement de la date du composant !");
this.dateNow = new Date();
}
... но без успеха.
Идеальное решение, спасибо. Я заметил, что он работает также со следующими методами: ngOnChanges, ngDoCheck, ngAfterContentChecked. Так есть лучший вариант? – abreneliere
Это зависит от вашего варианта использования. Если вы хотите что-то сделать, когда компонент инициализирован, 'ngOnInit()' обычно является первым местом. Если код зависит от отображаемой DOM 'ngAfterViewInit()' или 'ngAfterContentInit()' являются следующими параметрами. 'ngOnChanges()' отлично подходит, если код должен выполняться каждый раз при изменении ввода. 'ngDoCheck()' предназначен для пользовательских изменений. На самом деле я не знаю, для чего лучше использовать 'ngAfterViewChecked()'. Я думаю, что он вызывается непосредственно перед или после 'ngAfterViewInit()'. –
Я пытаюсь изменить this.value, чтобы предотвратить установку недопустимого значения, однако описанная здесь методика не работает для меня. Есть ли другой способ, которым я должен это делать? –