2016-09-30 2 views
33

Мой компонент имеет стили, которые зависят от текущего времени и времени. В моем компоненте у меня есть следующая функция.Как управлять выражением 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(); 
    } 

... но без успеха.

ответ

97

обнаружения изменения Run явно после изменения:

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(); 
} 
+0

Идеальное решение, спасибо. Я заметил, что он работает также со следующими методами: ngOnChanges, ngDoCheck, ngAfterContentChecked. Так есть лучший вариант? – abreneliere

+8

Это зависит от вашего варианта использования. Если вы хотите что-то сделать, когда компонент инициализирован, 'ngOnInit()' обычно является первым местом. Если код зависит от отображаемой DOM 'ngAfterViewInit()' или 'ngAfterContentInit()' являются следующими параметрами. 'ngOnChanges()' отлично подходит, если код должен выполняться каждый раз при изменении ввода. 'ngDoCheck()' предназначен для пользовательских изменений. На самом деле я не знаю, для чего лучше использовать 'ngAfterViewChecked()'. Я думаю, что он вызывается непосредственно перед или после 'ngAfterViewInit()'. –

+0

Я пытаюсь изменить this.value, чтобы предотвратить установку недопустимого значения, однако описанная здесь методика не работает для меня. Есть ли другой способ, которым я должен это делать? –

19

Это хороший пост, чтобы понять эту ошибку. Это не слишком долго читать.

+4

Будет здорово, если вы можете разместить здесь соответствующий контент. Если URL-адрес нарушен, ответ не имеет значения. Ссылка только ответы обескуражены – Eldho