我有一个巨大的模型驱动形式,它的字段可能会影响彼此的行为,例如:
如果字段A的值发生变化,则应从服务器获取字段B的值,或者如果字段C的值发生变化,则应禁用字段D.等
为了检测更改,我使用 valueChanges :
this.form.controls['a'].valueChanges.subscribe(data=>{
//do some staff
});
this.form.controls['b'].valueChanges.subscribe(data=>{
//do some staff
});
.
.
.
(请注意,我不能说this.form.valueChanges
因为我的表单有大约50个字段)。一切看起来都不错,但这种做法让我ngOnInit()
有点凌乱。我的问题是:
对于这样的情况,是否有更好/更有效的解决方案?在ngOnInit中订阅太多的可观察量并不会产生任何问题?如何改进我的代码?
答案 0 :(得分:1)
在模板上使用角度event binding
会更清晰。将其与data: function data() {
return {
center:'',
组合用于双向数据绑定,它可以使您的组件代码更清晰。
例如:
ready () {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
let centerObj ={};
centerObj.lat = position.coords.latitude;
centerObj.lng = position.coords.longitude;
this.center = centerObj;
this.usermarkers.push({
position: { lat:this.center.lat, lng: this.center.lng }
});
}.bind(this), function (error) {
if (error.code == error.PERMISSION_DENIED)
alert('Please Enable Location Services');
}.bind(this));
}
},
您可以在Angular2中为ngModel
,<input type="text" formControlName="a" [(ngModel)]="inputValue" (change)="doSomething($event)">
,event binding
,change
等DOM事件执行click
。
修改强>
keyup
仅在输入文本框外单击时才会被触发。blur
相比,change
是更好的选择。请参阅此Plunk以比较差异。