I am updating a Reactive FormGroup
control value from my component via patchValue.
Ex:
this.myForm.patchValue({incidentDate:'2016-09-12');
This works great and triggers a valueChanges
event, however this control's dirty
property is still false
.
I need the incidentDate
control to be dirty
so my validation logic knows to run against this control.
How do I update the value of a control from my component AND indicate that it is dirty?
Here is my validation logic:
onValueChanged(data?: any) {
if (!this.myForm) {
return;
}
const form = this.myForm;
for (const field in this.formErrors) {
// clear previous error message (if any)
this.formErrors[field] = '';
const control = form.get(field);
if (control && control.dirty && !control.valid) {
const messages: any = this.validationMessages[field];
for (const key in control.errors) {
this.formErrors[field] += messages[key] + ' ';
}
}
}
}
You should use the markAsDirty method, like this: control. markAsDirty(); This will also mark all direct ancestors as dirty to maintain the model.
The setValue accepts an object that matches the structure of the FormGroup with control names as keys. The object supplied to setValue should exactly match the structure of this form group i.e. the object should contain each and every form control names as keys. Find the setValue method declaration from Angular doc.
The PatchValue is used to update only a subset of the elements of the FormGroup or FormArray . It will only update the matching objects and ignores the rest.
I usually do this:
this.formControl.markAsDirty()
Or in your case it could be:
this.myForm.get('incidentDate').markAsDirty()
If you have a group or array that you need to mark as dirty you can use this
export class Helpers {
/**
* Loop and touch all it has
*
* @param {FormGroup} formGroup
* @param func << function name: [markAsTouched, markAsUntouched, markAsDirty, markAsPristine, markAsPending
* @param opts
*
*/
public static touchAll(formGroup: FormGroup|FormArray, func = 'markAsDirty', opts = {onlySelf: false}): void {
mapValues(formGroup.controls, (c, i) => {
if (c instanceof FormGroup || c instanceof FormArray)
Helpers.touchAll(c, func, opts);
else
c[func](opts);
})
}
}
You can use the SuperForm npm package to do that for you.
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