2017-04-03 34 views
0

嘗試使用雙向綁定工作,但在檢查異常後更改了表達式。當模式更改爲取消並且我想將該值重置爲空時,我得到異常。我認爲這是因爲我在一個具有不同價值的變化週期內發光,但不知道如何避免?Angular 2 way binding component - 檢查後表達式發生了變化

<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

一種方法周圍是手動分離的2路綁定:綁定的投入組件並將組件中的Eventemitter綁定到輸出,但不要使用「同一個」。這是希望將2路綁定到必須處理傳入數據的組件時最乾淨的方法。 – EluciusFTW

回答

1

角不喜歡。由變化檢測調用ngOnChanges

無論是移動代碼到另一個回調不會導致此錯誤(我認爲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沒有,我得到相同的例外。設置超時工作,但似乎有點hacky。現在我啓用了prod模式。如果現在有更好的解決方案,請留下問題。 – Chris

+0

啓用prod模式是恕我直言最糟糕的做法。你也可以嘗試'ngAfterViewInit'。 AFAIR至少有一個回調工作。最好的方法是不要改變'ngOnChanges'中的模型。如何使'field'成爲setter並在其中添加代碼?我不知道'this.fieldChange.emit(「」)'會在那裏引發問題。 –

+0

ngAfterViewInit每個組件僅調用一次,所以無法工作。如何根據您的建議更新html以允許使用setter。謝謝! – Chris

相關問題