Angular 2 - 在ngOnInit()中订阅的观察次数太多

时间:2017-01-24 10:03:28

标签: angular angular2-forms ngoninit

我有一个巨大的模型驱动形式,它的字段可能会影响彼此的行为,例如:

如果字段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中订阅太多的可观察量并不会产生任何问题?如何改进我的代码?

1 个答案:

答案 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 bindingchange等DOM事件执行click

修改

  • keyup仅在输入文本框外单击时才会被触发。
  • blur相比,
  • change是更好的选择。

请参阅此Plunk以比较差异。