2016-09-30 9 views
33

Myコンポーネントは現在の日時に依存するスタイルを持っています。私のコンポーネントでは、次の機能があります。コンポーネントのプロパティが現在の日時に依存する場合、Angular2 "式がチェックされた後に式が変更されました"

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%)' 

私は例外値がチェックされているだけで、現時点では開発モードで表示されます知っています。チェックされた値が更新された値と異なる場合、例外がスローされます。

だから私は例外を防ぐために、以下のフックメソッドで各ライフサイクルで現在の日時を更新しようとしました:

ngAfterViewChecked() 
    { 
    console.log("! changement de la date du composant !"); 
    this.dateNow = new Date(); 
    } 

...成功せず。明示的に変更した後

答えて

97

ラン変化検出:

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

関連する問題