首页 文章

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

提问于
浏览
13

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

这是过程:

  • 从服务结果创建表单和 setValue

  • 修改值并提交表单

  • 如果表单已正确提交给服务,则重置并保留值

How to keep values as modified and reset the form to its pristine state.

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

3 回答

  • 6

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

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

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

    this.myReactiveForm.reset(this.myReactiveForm.value);
    

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

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

  • 8

    这很简单:

    this.form.markAsPristine();
    this.form.markAsUntouched();
    

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

  • 23

    对angular / material2的用户的注意事项

    有's an added complication if you'使用角度材质控件, 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 .

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

    另请注意,ErrorStateMatcher仅在角度材质中 - 而不是标准角形式的一部分 .

相关问题