Angular2: How do you mark FormGroup control dirty

2020-02-10 12:15发布

问题:

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] + ' ';
        }
      }
    }
}

回答1:

I usually do this:

this.formControl.markAsDirty()

Or in your case it could be:

this.myForm.get('incidentDate').markAsDirty()


回答2:

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.



标签: angular