如何查看除特定控件外的所有 FormControls ValueChanges?
How to watch all FormControls ValueChanges except specific control?
我有一个表格,只要控件输入值发生变化,它就会进行计算。
这是我的 form_group
样子:
form_group = this.fb.group({
control1: [],
control2: [],
control3: [],
...
control10: [],
});
我可以通过 form_group.valueChanges
observable 检测所有控件值的变化,并进行计算。但是我想排除一些不需要执行此类操作的控件。
但是无论如何如何不检测特定控件上的更改?
写一个form_group.get('controlN').valueChanges
然后在那里做一个计算很麻烦。我的表单中有 5 个或更多控件。
您只需要像这样访问控件并订阅值更改属性
this.form_group.get('control1').valueChanges.subscribe(value => {
console.log(value)
})
您可以像这样将单个 valueChanges Observables 合并为一个:
Observable.merge(
[ control1.valueChanges,
control2.valueChanges ]
).subscribe(() => {
// do your computation
});
有什么原因导致您不能创建一个 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 中应用一些逻辑来排除您不想订阅的控件
像这样,我想观察多个控件的变化,我可以这样做。
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
您可以按照以下方式进行:
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)
);
}
您还可以针对当前任务调整过滤器
我有一个表格,只要控件输入值发生变化,它就会进行计算。
这是我的 form_group
样子:
form_group = this.fb.group({
control1: [],
control2: [],
control3: [],
...
control10: [],
});
我可以通过 form_group.valueChanges
observable 检测所有控件值的变化,并进行计算。但是我想排除一些不需要执行此类操作的控件。
但是无论如何如何不检测特定控件上的更改?
写一个form_group.get('controlN').valueChanges
然后在那里做一个计算很麻烦。我的表单中有 5 个或更多控件。
您只需要像这样访问控件并订阅值更改属性
this.form_group.get('control1').valueChanges.subscribe(value => {
console.log(value)
})
您可以像这样将单个 valueChanges Observables 合并为一个:
Observable.merge(
[ control1.valueChanges,
control2.valueChanges ]
).subscribe(() => {
// do your computation
});
有什么原因导致您不能创建一个 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 中应用一些逻辑来排除您不想订阅的控件
像这样,我想观察多个控件的变化,我可以这样做。
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
您可以按照以下方式进行:
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)
);
}
您还可以针对当前任务调整过滤器