Formbuilder的patchvalue或setvalue不会将字段标记为脏或被触摸

Hac*_*ker 5 angular angular4-forms

我有一个多步骤表单,其中用户来回遍历表单。我将表单数据保存在服务中,当他回来时,我使用patchvalue将所有数据打补丁成表单。我也尝试了setvalue,但是表单字段没有被标记为脏的或被触摸的。我如何将已更新的字段标记为脏的?

this.formBuilder.pathValue(formData);
Run Code Online (Sandbox Code Playgroud)

Pan*_*kar 13

您可以在表单对象上使用markAsDirty()&markAsTouched()方法显式标记表单。在此处查看API

this.formName.markAsDirty()
this.formName.markAsTouched()
Run Code Online (Sandbox Code Playgroud)

更新

从 Angular 8 开始,您可以使用markAllAsTouched将所有表单字段标记为touched

this.formName.markAllAsTouched()
Run Code Online (Sandbox Code Playgroud)

  • @AntónioQuadrado 只有用户交互才会设置脏标志。这是故意的。请参阅此讨论:https://github.com/angular/angular/issues/9768 (3认同)
  • 我也遇到了这个问题,尽管可以使用您引用的方法,但我们似乎不必手动执行此操作。我的观点是,如果新值与旧值不同并自动设置相应的标志,最好进行角度验证。 (2认同)

小智 6

我为这个问题找到的唯一解决方案是。

 this.form = this.formBuilder.group({
      id:[null],
      name: ValidatorsUtil.name(),
      lastName: ValidatorsUtil.required(),
      email: ValidatorsUtil.email(),
      phone: ValidatorsUtil.required(),      
    });

this.form.setValue(this.client, {emitEvent: true});

Object.keys(this.form.controls).forEach( controlKey => {
       this.form.controls[controlKey].markAsDirty();
     });
Run Code Online (Sandbox Code Playgroud)