Angular2:你如何通过`patchValue()`标记FormGroup控件脏

时间:2016-10-01 03:56:42

标签: angular

我正在通过patchValue从我的组件更新反应FormGroup控制值。

例如:

this.myForm.patchValue({incidentDate:'2016-09-12');

效果很好并触发valueChanges事件,但此控件的dirty属性仍为false

我需要incidentDate控件为dirty,因此我的验证逻辑知道要针对此控件运行。

如何更新组件中控件的值并指示它是否为脏?

这是我的验证逻辑:

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

3 个答案:

答案 0 :(得分:32)

我通常这样做:

this.formControl.markAsDirty()

或者在你的情况下可能是:

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

答案 1 :(得分:1)

如果您有一个需要标记为脏的组或阵列,则可以使用此

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);
    })
  }
}

您可以使用SuperForm npm package为您执行此操作。

答案 2 :(得分:0)

在FormGroup中标记为脏控件(仅包含值的控件)

  markDirtyAllControlsWithValue(form: FormGroup): void {
    const recursiveFunc = (formGroup: FormGroup) => {
      Object.keys(formGroup.controls).forEach(field => {
        const control = formGroup.get(field);
        if (control.value !== null && control.value !== undefined && control.value !== '') {
          control.markAsDirty();
        }
        if (control instanceof FormGroup) {
          recursiveFunc(control);
        }
      });
    };
    recursiveFunc(form);
  }