Angular Reactive表单:如何重置表单状态并在提交后保留值

Exa*_*Psa 25 angular

以角度反应形式.成功提交后如何仅重置表单状态

这是过程:

  • setValue从服务结果创建表单
  • 修改值并提交表单
  • 如果表单已正确提交到服务,则重置并保留值

如何将值保持为已修改并将表单重置为其原始状态.

form.reset()只是清空表单.但是,如果我不调用它,状态不会被重置,例如我的验证取决于表单状态类(原始,脏,有效等)仍然存在.

Bla*_*axy 42

@smnbbrv的解决方案效果很好.

您还可以将实际表单值提供给reset()方法.

鉴于事实myReactiveForm是组件中的Reactive表单.成功提交表单后(例如通过调用服务),您可以执行以下操作:

this.myReactiveForm.reset(this.myReactiveForm.value);
Run Code Online (Sandbox Code Playgroud)

它将重置表单并将"新"表单值设置为您所形成的相同值.

这个方法可以在Tour of Hero示例官方Angular.io doc中看到

  • 尝试过,此解决方案不起作用。因为反应式表单立即从输入字段接收最新值,所以传递给“重置”方法的“ this.myReactiveForm.value”不会反映表单的先前状态,而是表单上的最新值。因此,这种复位方式导致无操作。此解决方案下的表单保持不变,而不是按预期方式还原/重置为先前状态。 (3认同)
  • 这真是一个黑客:D 但是,我必须承认它应该有效;) (2认同)

smn*_*brv 15

这很简单:

this.form.markAsPristine();
this.form.markAsUntouched();
Run Code Online (Sandbox Code Playgroud)

这将重置表单元数据,表单再次保持原始状态


Sim*_*ver 9

对角钢/材料​​用户的警告2

如果您使用角度材质控件mat-error来显示错误,则会增加复杂性。根据ErrorStateMatcher(除*ngIf您可能已应用的结果之外)的结果显示此类错误。

默认ErrorStateMatcher显示错误,如果符合下列条件:

isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean 
{
   return !!(control && control.invalid && (control.touched || (form && form.submitted)));
}
Run Code Online (Sandbox Code Playgroud)

所以,这是什么说的是,如果表单已不断被提交和控制变得无效(每个验证规则),那么将显示错误。这通常不是您想要的(特别是如果您正在阅读此问题!)。

查看源代码- submitted = false除非您调用resetFormngForm指令(而不是FormGroup对象),否则无法进行设置。将状态设置为原始状态或未更改状态不会重置为false。

如果您使用的是问题mat-error,可能会发现为自定义逻辑创建自己的ErrorStateMatcher(简单接口)会更容易。

还要注意,ErrorStateMatcher仅采用角材料-而不是标准角形式的一部分。

  • 正如这个答案所指出的,在这种情况下(当使用“FormGroup#reset()”休息表单时,验证器将在表单上显示错误,请使用模板变量``<form #login =“ngForm”... >``` 并将登录模板变量传递给您的 `(ngSubmit)="submit(login)"` 函数并对其调用 `resetForm()`。或者不必依赖提交事件,请使用 `@ViewChild ('login') private _loginNgForm: NgForm;` 然后 `this._loginNgForm.resetForm();` (2认同)

Sam*_*ath 9

04-06-2020: Ionic 5+ 和 Angular 9+

只是一行。IEthis.form.reset();

重置 FormGroup,将所有后代标记为原始和未触及,并且所有后代的值都为 null。

 form: FormGroup;

 constructor(private formBuilder: FormBuilder, ) { }

  resetTheForm(): void {
    this.form.reset();
  }
Run Code Online (Sandbox Code Playgroud)

  • 这会调用所有错误验证器。 (2认同)

The*_*bee 5

对于反应式表单,在使用 Angular 7 时对我有用的是:使用模板驱动表单并通过表单提交处理程序传递它,如下所示

// component.html
 <form #f="ngForm" [formGroup]="form" (ngSubmit)="onSubmit(f)" novalidate>
 ....
</form>


// component.ts

onSubmit(form: NgForm) {

// reset form here
 form.form.markAsPristine();
 form.resetForm();
}

Run Code Online (Sandbox Code Playgroud)

它将把表单和提交状态重置为默认值。


Kum*_*mal 5

我使用补丁值来清除反应式表单控件。它对我有用。请尝试下面的代码。

onClear() {
   this.formGroup.patchValue({
     fieldName: ''
   });
}
Run Code Online (Sandbox Code Playgroud)