77

我有一个显示<input type="text">元素列表的表单。它们都共享一个通用的保存按钮,该按钮在表单变脏之前被禁用。然后,一旦用户点击保存按钮,数据就会被提交到服务器。如果服务器成功保存了数据,我想将表单重置为原始状态,但我想保留表单中的所有数据,以便用户可以选择进一步编辑数据。

经过搜索,我找到了NgForm.reset()方法。虽然这确实将表单设置为原始状态,但不幸的是它也清除了表单。reset 方法似乎确实有一个 value 参数,但我似乎无法找出它的作用。尽管如此,我不希望数据被清除。

我也尝试myForm.pristine = true过,但是由于某种原因这会导致页面重新加载。

这是一个演示问题的 plunkr

4

7 回答 7

170

您正在寻找的是myForm.form.markAsPristine().

于 2017-01-17T15:12:51.150 回答
37

目前,我可以提出两种可能的解决方案。第一个非常接近您的建议,因为表单的reset方法具有以下签名并接受表单值作为第一个参数:

//@angular/forms/src/model.d.ts:
reset(value?: any, {onlySelf}?: { onlySelf?: boolean; }): void;

在提交处理程序中,我们将捕获最后一个状态的副本:

const { myForm: { value: formValueSnap } } = this;

并自行重置:

this.myForm.reset(formValueSnap, false);

在无法重置表单的时代,另一种选择是创建一个辅助方法,它将每个控件标记为pristine并保留数据。可以在同一个提交助手中调用它来代替重置。

private _markFormPristine(form: FormGroup | NgForm): void {
    Object.keys(form.controls).forEach(control => {
        form.controls[control].markAsPristine();
    });
}

链接到更新的plunkr

于 2016-11-20T19:29:59.777 回答
15

如果你碰巧使用的是模板驱动的表单,并且你的组件中有这样的东西: @ViewChild('myForm') myform: NgForm;

我发现这markAsPristine()是表单的表单属性上的一个函数。所以它会this.myform.form.markAsPristine()

只是想我会添加这个以防其他人遇到markAsPristine()未定义的情况。

于 2017-06-15T03:31:23.743 回答
4

当使用 Angular 的响应式表单时,您可以在 FormGroup 上使用markAsPristine()

export class MyPage

  // Your form group
  public formGroup: FormGroup;

  ngOnInit() {
    this.formGroup = this.formBuilder.group({
      // Add your form controls here
    });
  }

  onSubmitForm() {
    // Get form value and save data on the server
    // ...

    this.formGroup.markAsPristine(); // <=== Mark form group as pristine
  }
}

另请参阅:AbstractControl.markAsPristine()的文档。注意:FormGroup 是 AbstractControl 的子类。它将 FormGroup 的所有子级标记为原始。

于 2020-05-12T16:24:33.590 回答
2

我想我用我的方法解决了这个问题:

form.controls['contato'].reset();

于 2017-11-29T13:07:23.293 回答
-2

我没有在form属性中找到markAsPristine(),但是我找到了一个_pristine属性,this.myForm['form']._pristine可以设置为true.

@ViewChild('myForm') myForm: ElementRef;
this.myForm['form']._pristine = true;
于 2017-08-30T19:36:40.630 回答
-3

要重置表单:

this.form.reset();
于 2020-09-09T17:21:46.397 回答