I am using reactive forms in Angular 7.
I have many fields that are dependent on other fields.
What I am curious about of what should I use (change)
or this.form.get("control_name").valueChanges
?
For ex. if both will work on inputs then I want to know difference, pros & cons between them.
Which is better with performance?
Let's just consider that what you're looking for is to listen to a change on an input
tag of type="text"
valueChanges
Since it is an Observable, it will fire with a new value. This value will be the changed value of the input
field. And to listen to it, you will have to subscribe
to the valueChanges
Observable. Something like this:
this.form1.controls['name'].valueChanges.subscribe(change => {
console.log(change); // Value inside the input field as soon as it changes
});
(change)
eventIn case of the change
event, for input
tag, the change
event will only fire once you blur
away from that input
field. Also, in this case, you'll get the $event
Object. And from that $event
Object, you'll have to extract the field value.
So in code, this will look something like this:
import { Component } from '@angular/core';
import { FormGroup, FormBuilder } from '@angular/forms';
@Component({...})
export class AppComponent {
name = 'Angular';
form1: FormGroup;
form2: FormGroup;
constructor(private fb: FormBuilder) {}
ngOnInit() {
this.form1 = this.fb.group({
name: [],
email: []
});
this.form2 = this.fb.group({
name: [],
email: []
});
this.form1.controls['name'].valueChanges.subscribe(change => {
console.log(change);
});
}
onForm2NameChange({ target }) {
console.log(target.value);
}
}
And in the Template:
<form [formGroup]="form1">
<input type="text" formControlName="name">
<input type="text" formControlName="email">
</form>
<hr>
<form [formGroup]="form2">
<input type="text" formControlName="name" (change)="onForm2NameChange($event)">
<input type="text" formControlName="email">
</form>
Here's a Working Sample StackBlitz for your ref.
NOTE: It completely depends on your use case as to which one would be more suitable.
For your specific use case, I would suggest using RxJS Operators to get the job done. Something like this:
zipCodeFormControl
.valueChanges
.pipe(
debounceTime(500),
distinctUntilChanged(),
switchMap(
zipcode => getAddressFromZipcode(zipcode)
),
map(res => res.actualResult)
)
.subscribe(addressComponents => {
// Here you can extract the specific Address Components
// that you want to auto fill in your form and call the patchValue method on your form or the controls individually
});
This is case-to-case, but I find that things like checkboxes and radio buttons (true/false type controls) work better with the (change) handler and inputs and textfields are generally more suitable for valueChanges.
Although I'm not sure of performance, I assume this would be the ideal use case when dealing with this decision.
A good use case for valueChanges (for everything) is a complex form with a lot of ngIf logic. Sometimes these forms need a "chain reaction" of value changes to work correctly, in which case a (change) handler would be useless
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With