Angular 响应式表单:仅对某些特定的表单控件进行反跳
Angular Reactive Forms: Debounce only some specific Form Control
我有一个简单的搜索组件,其中包含一个具有 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
});
}
}
去抖文本控件的 valueChanges
observable,然后使用 combineLatest()
将其与复选框控件的 valueChanges
observable 结合。
在将它们添加到表单组之前创建每个单独的 FormControl,然后您可以控制每个 FormControl 可观察到的 valueChanges
this.textInput.valueChanges
.pipe(
debounceTime(400),
distinctUntilChanged()
)
.subscribe(res=> {
console.log(`debounced text input value ${res}`);
});
distinctUntilChanged 将确保只有当值不同时才会发出一些东西。
GitHub 上有一个问题,将来可能(?!)解决这个问题:
https://github.com/angular/angular/issues/19705
那么应该可以(如 AngularJS 中那样)去抖动单个输入字段。
窗体组中单个控件的去抖可以通过
完成
this.form.get('textInput')
.valueChanges
.pipe(debounceTime(500))
.subscribe(dataValue => {
console.log("dataValue", dataValue);
});
我现在遇到了这个问题,我是这样解决的!
// 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 将呈现触发事件的控件并且能够在 observable
中使用过滤器
此致!
我遇到了同样的问题,在我的例子中创建了一个新的输入组件并提供了去抖动值 html 解决了没有任何自定义代码的问题
我有一个简单的搜索组件,其中包含一个具有 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
});
}
}
去抖文本控件的 valueChanges
observable,然后使用 combineLatest()
将其与复选框控件的 valueChanges
observable 结合。
在将它们添加到表单组之前创建每个单独的 FormControl,然后您可以控制每个 FormControl 可观察到的 valueChanges
this.textInput.valueChanges
.pipe(
debounceTime(400),
distinctUntilChanged()
)
.subscribe(res=> {
console.log(`debounced text input value ${res}`);
});
distinctUntilChanged 将确保只有当值不同时才会发出一些东西。
GitHub 上有一个问题,将来可能(?!)解决这个问题:
https://github.com/angular/angular/issues/19705
那么应该可以(如 AngularJS 中那样)去抖动单个输入字段。
窗体组中单个控件的去抖可以通过
完成 this.form.get('textInput')
.valueChanges
.pipe(debounceTime(500))
.subscribe(dataValue => {
console.log("dataValue", dataValue);
});
我现在遇到了这个问题,我是这样解决的!
// 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 将呈现触发事件的控件并且能够在 observable
中使用过滤器此致!
我遇到了同样的问题,在我的例子中创建了一个新的输入组件并提供了去抖动值 html 解决了没有任何自定义代码的问题