2017-04-03 72 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

相关问题