【问题标题】:Angular 2 - too many observables to subscribe in ngOnInit()Angular 2 - 在 ngOnInit() 中订阅的 observable 太多
【发布时间】:2017-06-09 01:51:26
【问题描述】:

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

如果字段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 中订阅过多的 observables 不会产生任何问题?如何改进我的代码?

【问题讨论】:

    标签: angular angular2-forms ngoninit


    【解决方案1】:

    在模板上使用 angular event binding 会更简洁。结合 ngModel 进行双向数据绑定,它可以让你的组件代码更加简洁。

    例如:

    <input type="text" formControlName="a" [(ngModel)]="inputValue" (change)="doSomething($event)">
    

    您可以在 Angular2 中为 DOM 事件执行 event binding,例如 changeclickkeyupblur 等。

    编辑:

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

    查看此Plunk 以比较差异。

    【讨论】:

    • 使用(更改)会延迟,看这里:stackoverflow.com/a/34616143/4221872
    • 实际上change 事件仅在blur 上触发。如果您希望在键入时触发事件,则可以使用keyupkeyupvalueChanges.subscribe 之间的延迟可以忽略不计。我整理了一个Plunk 供您验证。 http://plnkr.co/edit/1glzZEvFmO08IUwTIbAQ?p=preview
    • 更改的主要问题是使用选择标签,如果我在console.log() &lt;select&gt; formControl 的(change) 方法中的值,它显示我它是以前的值。所以我使用了 valueChanges
    • 嗯.. 我不确定你是如何测试的。请参阅Plunk。我现在已经给它添加了一个选择元素,你可以看到(change)返回了新的值!!
    • 谢谢!我明白了;-)
    猜你喜欢
    • 2018-06-12
    • 2017-05-13
    • 2017-01-30
    • 2016-10-28
    • 1970-01-01
    • 2019-01-25
    • 2021-01-25
    • 2016-05-05
    • 2018-12-27
    相关资源
    最近更新 更多