以角度反应形式 . 如何在成功提交后仅重置 state 表单?
这是过程:
从服务结果创建表单和 setValue
setValue
修改值并提交表单
如果表单已正确提交给服务,则重置并保留值
How to keep values as modified and reset the form to its pristine state.
form.reset()只是清空表单 . 但是,如果我不调用它,状态不会被重置,例如我的验证取决于表单状态类(原始,脏,有效等)仍然存在 .
@smnbbrv的解决方案效果很好 .
您还可以将实际表单值提供给reset()方法 .
鉴于 myReactiveForm 是您组件中的Reactive表单 . 成功提交表单后(例如通过调用服务),您可以执行以下操作:
myReactiveForm
this.myReactiveForm.reset(this.myReactiveForm.value);
它将重置表单并将“新”表单值设置为您所形成的相同值 .
这个方法可以在Tour of Hero例子中看到Official Angular.io doc
这很简单:
this.form.markAsPristine(); this.form.markAsUntouched();
这将重置表单元数据,表单再次保持原始状态
有's an added complication if you'使用角度材质控件, mat-error 显示您的错误 . 基于 ErrorStateMatcher 的结果显示此类错误(除了您可能已应用的任何 *ngIf ) .
mat-error
ErrorStateMatcher
*ngIf
如果满足以下条件,default ErrorStateMatcher将显示错误:
isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { return !!(control && control.invalid && (control.touched || (form && form.submitted))); }
所以这就是说,如果表单已经提交并且控件变为无效(根据验证规则),那么将显示错误 . 这通常不是你想要的(特别是如果你正在阅读这个问题!) .
查看源代码 - 除非在ngForm指令(而不是FormGroup对象)上调用resetForm,否则无法设置 submitted = false . 将状态设置为pristine或untouched不会重置为false .
submitted = false
如果您正在使用 mat-error ,如果这是一个问题,您可能会发现为自定义逻辑创建自己的ErrorStateMatcher(简单接口)更容易 .
另请注意,ErrorStateMatcher仅在角度材质中 - 而不是标准角形式的一部分 .
3 回答
@smnbbrv的解决方案效果很好 .
您还可以将实际表单值提供给reset()方法 .
鉴于
myReactiveForm
是您组件中的Reactive表单 . 成功提交表单后(例如通过调用服务),您可以执行以下操作:它将重置表单并将“新”表单值设置为您所形成的相同值 .
这个方法可以在Tour of Hero例子中看到Official Angular.io doc
这很简单:
这将重置表单元数据,表单再次保持原始状态
对angular / material2的用户的注意事项
有's an added complication if you'使用角度材质控件,
mat-error
显示您的错误 . 基于ErrorStateMatcher
的结果显示此类错误(除了您可能已应用的任何*ngIf
) .如果满足以下条件,default ErrorStateMatcher将显示错误:
所以这就是说,如果表单已经提交并且控件变为无效(根据验证规则),那么将显示错误 . 这通常不是你想要的(特别是如果你正在阅读这个问题!) .
查看源代码 - 除非在ngForm指令(而不是FormGroup对象)上调用resetForm,否则无法设置
submitted = false
. 将状态设置为pristine或untouched不会重置为false .如果您正在使用
mat-error
,如果这是一个问题,您可能会发现为自定义逻辑创建自己的ErrorStateMatcher(简单接口)更容易 .另请注意,ErrorStateMatcher仅在角度材质中 - 而不是标准角形式的一部分 .