I have a simple Search Component which contains a Reactive Form with 2 elements:
So far I use myFormGroup.valueChanges.subscribe(...)
to execute my search method.
Now the problem is, that I want to debounce the text input. And at the same time not debounce the checkbox, so the search method is getting executed instantly when clicking the checkbox.
Using valueChanges.debounceTime(500)
will of course debounce the whole form. That's not what I want.
This is a stripped down example. The real form has some more inputs. Some should be debounced and some shouldn't.
Is there any easy way to get this done? Or do I have to subscribe to every form control separately?
Would be nice to see how you did solve this.
Thanks in advance.
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
});
}
}
Create each individual FormControl before adding them to the form group and then you can control the valueChanges observable per FormControl
this.textInput.valueChanges
.pipe(
debounceTime(400),
distinctUntilChanged()
)
.subscribe(res=> {
console.log(`debounced text input value ${res}`);
});
the distinctUntilChanged will make sure only when the value is diffrent to emit something.
Debounce the text control's valueChanges
observable, then use combineLatest()
to combine it with the checkbox control's valueChanges
observable.
Debounce for a single control in a form group can be done by
this.form.get('textInput')
.valueChanges
.pipe(debounceTime(500))
.subscribe(dataValue => {
console.log("dataValue", dataValue);
});
Right now I had that problem, I solved it as follows!
// 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);
});
you have response speed in the controls within the form group and a delay in the events emitted from the individual control, hopefully in the future that the valueChanges emitted by the formGroup will present the control that triggered the event and be able to use filter in the observable
Regards!
There's an issue on GitHub, which may(?:) solve this in the future:
https://github.com/angular/angular/issues/19705
Then it should be possible (like in AngularJS) to debounce single input fields.
I faced the same issue and in my case creating a new Input component and providing debounce value in html solved issue without any custom code
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.