2017-04-03 22 views
0

双方向バインディングを使用しようとしましたが、例外がチェックされた後に式が変更されました。モードがキャンセルに変わったときに値を空にリセットしたい場合は、例外が発生します。別の価値を持った変更サイクルの中に出ているが、回避する方法がわからないので、それは私が想定している?角度2ウェイバインディングコンポーネント - 式がチェックされた後に変更されました

<edit-field [mode]="mode" [(field)]="field"></edit-field> 

私のコンポーネントは次のとおりです。変化検出は、モデルの変更が発生したときに

export class EditFieldComponent implements OnChanges { 
     @Input('mode') mode: string; 
     @Input('field') field: string; 
     @Output('fieldChange') fieldChange: EventEmitter<string> = new EventEmitter<string>(); 

    ngOnChanges() { 
     if(this.mode == 'cancel'){ 
     this.field = ""; 
     this.fieldChange.emit(""); 
    } 
    } 
} 
+0

を使用していない別のコールバックにコードを移動:への入力をバインドそのコンポーネントのEventemitterを出力にバインドしますが、「同じもの」は使用しません。受信データを操作する必要があるコンポーネントへの双方向バインディングが必要な場合は、これが最もクリーンな方法です。 – EluciusFTW

答えて

1

角度が好きではありません。 ngOnChangesが変更検出によって呼び出されます。

いずれかのことを回避する方法は、手動で2ウェイ結合を切り離すことで、このエラーの原因となる(私はngAfterViewChecked作品だと思います)、またはsetTimeout()

export class EditFieldComponent implements OnChanges { 
     @Input('mode') mode: string; 
     @Input('field') field: string; 
     @Output('fieldChange') fieldChange: EventEmitter<string> = new EventEmitter<string>(); 

    ngOnChanges() { 
     if(this.mode == 'cancel'){ 
      setTimeout(() => { 
      this.field = ""; 
      this.fieldChange.emit(""); 
      }); 
     } 
    } 
    } 
} 
+0

ありがとう、私はライフサイクルのフックがうまくいくことを望む。 AfterViewCheckは、私は同じ例外を取得しません。タイムアウトの設定は機能しますが、ちょっとハッキリしているようです。今のところ私はprodモードを有効にしました。今のところもっと良い解決策がある場合は、質問を開いたままにしておきます。 – Chris

+0

プロードモードを有効にすると、IMHOが最悪の方法です。また、 'ngAfterViewInit'を試してみることもできます。 AFAIR少なくとも1つのコールバックが動作します。最良の方法は 'ngOnChanges'でモデルを変更しないことです。 'field'をセッターにしてそこにコードを追加するのはどうでしょうか? 'this.fieldChange.emit(" ")'が問題を引き起こすかどうかはわかりません。 –

+0

ngAfterViewInitはコンポーネントごとに1回しか呼び出されないため、うまく動作しません。あなたが示唆したようにセッターを許可するようにhtmlを更新するにはどうすればいいですか?ありがとう! – Chris

関連する問題