formbuilder 的 patchvalue 或 setvalue 不会将字段标记为脏或已触及

Posted

技术标签:

【中文标题】formbuilder 的 patchvalue 或 setvalue 不会将字段标记为脏或已触及【英文标题】:patchvalue or setvalue of formbuilder does not mark field as dirty or touched 【发布时间】:2018-06-02 05:44:09 【问题描述】:

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

this.formBuilder.patchValue(formData);

【问题讨论】:

【参考方案1】:

您可以在表单对象上使用markAsDirty()markAsTouched() 方法显式标记表单。见API Here

this.formName.markAsDirty()
this.formName.markAsTouched()

更新

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

this.formName.markAllAsTouched()

【讨论】:

但这不会标记其值已更改为脏的字段吗? 我演示了表单级别的脏东西。您也可以在现场级别进行 我也遇到了这个问题,尽管可以使用您引用的方法,但似乎我们不应该手动进行。我的观点是,如果新值与旧值不同并自动设置相应的标志,那么进行角度验证会很好。 @AntónioQuadrado 只有用户交互设置脏标志。这是故意的。请参阅此讨论:github.com/angular/angular/issues/9768【参考方案2】:

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

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

【讨论】:

以上是关于formbuilder 的 patchvalue 或 setvalue 不会将字段标记为脏或已触及的主要内容,如果未能解决你的问题,请参考以下文章

Angular Reactive Forms,patchValue 不起作用,嵌套表单

Angular 8:反应式表单自动映射和 PatchValue 设置成员数据

如何在测试 Angular 2 反应形式中使用 setValue 和 patchValue

typescript 响应式表单:setValue方法和patchValue

在 Angular 12 反应形式中使用 patchValue 绑定表单数组的最佳方法

Angular 4 监听 setValue 或 patchValue 而不是使用 valueChanges