以角度反应形式。成功提交后如何仅重置表单的状态?
以下是流程:
setValue
如何将值保留为已修改并将表单重置为原始状态。
form.reset()只是清空表单。但是,如果我不调用它,状态不会被重置,例如我的验证取决于表单状态类(原始,脏,有效等)仍然存在。
答案 0 :(得分:28)
@smnbbrv的解决方案效果很好。
您还可以将实际表单值提供给reset()方法。
鉴于事件myReactiveForm
是组件中的Reactive表单。成功提交表单后(例如通过调用服务),您可以执行以下操作:
this.myReactiveForm.reset(this.myReactiveForm.value);
它将重置表单并设置" new"表格值与您所形成的值相同。
此方法可以在Tour of Hero示例Official Angular.io doc
中查看答案 1 :(得分:9)
这很简单:
this.form.markAsPristine();
this.form.markAsUntouched();
这会重置表单元数据,表单又是原始的
答案 2 :(得分:7)
如果您使用角度材质控件,则会增加一个复杂性,mat-error
用于显示错误。根据{{1}}的结果显示此类错误(除了您可能已应用的任何ErrorStateMatcher
之外)。
如果满足以下条件,default ErrorStateMatcher将显示错误:
*ngIf
所以这就是说,如果表单已提交 且控件变为无效(根据验证规则),则会显示错误。这通常不是您想要的(特别是如果您正在阅读此问题!)。
查看源代码-无法设置isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean
{
return !!(control && control.invalid && (control.touched || (form && form.submitted)));
}
,除非您对ngForm指令(不是FormGroup对象)调用resetForm
。将状态设置为原始状态或未更改状态不会重置为false。
如果您使用的是submitted = false
,则可能会发现为自定义逻辑创建自己的ErrorStateMatcher(简单接口)会更容易。
还请注意,ErrorStateMatcher仅采用角材料-而不是标准角形式的一部分。
答案 3 :(得分:6)
2020年6月6日:离子5+和Angular 9 +
只需一行。即this.form.reset();
重置FormGroup,将所有后代标记为原始且未更改,并将所有后代的值设置为null。
form: FormGroup;
constructor(private formBuilder: FormBuilder, ) { }
resetTheForm(): void {
this.form.reset();
}
答案 4 :(得分:1)
添加另一个答案,如果您的表单中有禁用的输入,请使用 getRawValue()作为 ngForm.resetForm()的参数。参见示例:
在HTML中:
<form
(ngSubmit)="formSubmit(myForm)"
#myForm="ngForm"
>
...
</form>
.TS中的
formSubmit(myForm: NgForm) {
myForm.resetForm(myForm.form.getRawValue());
}
答案 5 :(得分:0)
对于反应式表单,在使用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();
}
它将重置表单并将提交状态恢复为默认状态。
答案 6 :(得分:0)
某些时间this.myForm.reset(this.myForm.value);
可能不会重置为初始值
因此,最好创建一个单独的函数来初始化表单,然后在ngOnInit()中以及在调用this.myForm.reset(this.myForm.value);
ngOnInit(){
myFormValues();
}
myFormValues() {
this.myForm= this.fb.group({
id: ['', Validators.required],
name: ['', Validators.required],
});
}
submitForm() {
// save data
myFormValues();
this.myForm.reset(this.myForm.value)
}