我有一个简单的搜索组件,其中包含一个包含2个元素的活动表单:
到目前为止,我使用myFormGroup.valueChanges.subscribe(...)
来执行我的搜索方法。
现在的问题是,我想去除文本输入。同时不去除复选框,因此单击复选框时会立即执行搜索方法。
使用valueChanges.debounceTime(500)
当然会对整个表单进行辩护。那不是我想要的。
这是一个精简的例子。真实形式有更多的输入。有些应该被去除,有些则不应该。
有没有简单的方法来完成这项工作?或者我是否必须单独订阅每个表单控件?
很高兴看到你如何解决这个问题。
提前致谢。
export class SearchComponent {
myFormGroup: FormGroup;
constructor(fb: FormBuilder) {
this.myFormGroup = fb.group({
textInput: '',
checkbox: false
});
}
ngOnInit() {
this.myFormGroup.valueChanges.subscribe(val => {
// debounce only the textInput,
// and then execute search
});
}
}
答案 0 :(得分:4)
在将每个FormControl添加到表单组之前创建每个FormControl,然后您可以控制每个FormControl可观察的valueChanges
this.textInput.valueChanges
.pipe(
debounceTime(400),
distinctUntilChanged()
)
.subscribe(res=> {
console.log(`debounced text input value ${res}`);
});
distinctUntilChanged只有在值不同时才能确保发出一些东西。
答案 1 :(得分:4)
表单组中单个控件的反跳可以通过
完成Human
答案 2 :(得分:3)
现在我遇到了这个问题,我按如下方法解决了!
// Reactive control
fieldOne = this.formBuilder.control('');
// Reactive form
formGroup = this.formBuilder.group({
fieldOne: [],
fieldTwo: [],
fieldX: [],
});
this.fieldOne.valueChanges
.pipe(debounceTime(300))
.subscribe(value => {
this.formGroup.get('fieldOne').setValue(value);
});
您在窗体组内的控件中具有响应速度,并且从单个控件发出的事件有所延迟,希望将来由formGroup发出的valueChanges将呈现触发该事件并能够使用的控件过滤可观察的
致谢!
答案 3 :(得分:1)
撤消文本控件的valueChanges
可观察对象,然后使用combineLatest()
将其与复选框控件valueChanges
可观察对象合并。
答案 4 :(得分:-1)
GitHub上存在一个问题,未来可能会(?!)解决这个问题:
https://github.com/angular/angular/issues/19705
然后应该可以(比如在AngularJS中)去抖动单个输入字段。