如何查看除特定控件之外的所有 FormControls ValueChanges?

Posted

技术标签:

【中文标题】如何查看除特定控件之外的所有 FormControls ValueChanges?【英文标题】:How to watch all FormControls ValueChanges except specific control? 【发布时间】:2018-10-06 18:38:34 【问题描述】:

我有一个表单,只要控制输入值发生变化,就会进行计算。

这是我的form_group 的样子:

form_group = this.fb.group(
    control1: [],
    control2: [],
    control3: [],
    ...
    control10: [],
);

我可以通过form_group.valueChanges observable 检测到所有控件值的变化,并进行计算。但是我想排除一些不需要执行此类操作的控件。

但无论如何如何不检测特定控件的更改?

编写form_group.get('controlN').valueChanges 并在那里进行计算非常繁琐。我的表单中有 5 个或更多控件。

【问题讨论】:

【参考方案1】:

您可以通过以下方式进行:

combineLatest(this.getControlsForWatch()).subscribe(() => applyFilter());

getControlsForWatch(): Array<Observable<any>> 
        return (
            Object.entries(this.from.controls)
                .filter(([key]) => key !== 'exceptedControl')
                .map(([key]) => this.from.controls[key].valueChanges)
        );
    

您也可以为当前任务调整过滤器

【讨论】:

【参考方案2】:

这样,我想观察多个控件的变化,我能够这样做。

import  merge  from 'rxjs';
...
const merged = merge(this.control1.valueChanges,this.control2.valueChanges, this.control3.valueChanges, this.control4.valueChanges);

merged.subscribe(x => console.log(x));

参考:-https://rxjs-dev.firebaseapp.com/api/index/function/merge

【讨论】:

【参考方案3】:

您为什么不能创建一个 FormArray 而不是多个表单控件,这是有原因的吗?例如

form_group = this.fb.group(
    'controls': this.fb.array([...])
);

然后你可以在你的组件中定义一个属性

get controls(): FormArray 
    return <FormArray>this.form_group.get('control');

然后你可以从这里迭代表单数组并订阅valueChanges

this.controls.controls.forEach(control => 
    control.valueChanges.subscribe(...)
);

然后您可以在 for each 中应用一些逻辑来排除您不想订阅的控件

【讨论】:

【参考方案4】:

您可以像这样将单个 valueChanges Observables 合并为一个:

Observable.merge(
    [ control1.valueChanges,
      control2.valueChanges ]
  ).subscribe(() => 
    // do your computation
  );

【讨论】:

同样的只是想想如何获得 control1 或另一个 control refrence,merage 是一样的,就像所有 observable 都有一个观察者一样,我认为问题还没有解决,我会如果我从 valueChange 中得到,就像这个控件有新的值一样,我有 50 项 formArray,祝你好运 现在如果您想观看 9 个控件,您需要 9 个参考,所以我仍然希望有更好的方法 @MuhammadAlbarmawi 它工作效率高,代码更少,而不是为每个控件声明订阅。是的,当然这与您的建议相同,区别在于简单。 也许您可以将所有要查看的表单控件放入一个新组或 FormArray 中,以便您更轻松地管理它们?【参考方案5】:

您只需要像这样访问控件并订阅值更改属性

    this.form_group.get('control1').valueChanges.subscribe(value => 
        console.log(value)
    )

【讨论】:

这很糟糕,我想避免这种情况,因为我的表单中有很多表单控件并且我正在寻求一种更简单的方法

以上是关于如何查看除特定控件之外的所有 FormControls ValueChanges?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用角度链接功能禁用除特定元素之外的所有点击

正则表达式 - 如何匹配除特定模式之外的所有内容

如何使用 SQLAlchemy 核心选择除 postgresql 中的 1 个特定列之外的所有表列?

XPath 获取除具有特定名称的子元素之外的所有子元素?

在除特定页面 ID 之外的所有页面上设置 CSS 样式

在 WPF 窗口中禁用除一个子控件之外的所有子控件