如何在Angular 2中提交后清除表单?

mas*_*owo 63 angular2-forms angular

我有一些简单的角度2组件与模板.提交后如何清除表格和所有字段?我无法重新加载页面.用date.setValue('')字段设置数据后是stil touched.

import {Component} from 'angular2/core';
import {FORM_DIRECTIVES, FormBuilder, ControlGroup, Validators, Control} from 'angular2/common';

@Component({
    selector: 'loading-form',
    templateUrl: 'app/loadings/loading-form.component.html',
    directives: [FORM_DIRECTIVES]
})

export class LoadingFormComponent {
    private form:ControlGroup;
    private date:Control;
    private capacity:Control;

    constructor(private _loadingsService:LoadingsService, fb:FormBuilder) {
        this.date = new Control('', Validators.required);
        this.capacity = new Control('', Validators.required);
        this.form = fb.group({
            'date': this.date,
            'capacity': this.capacity
        });
    }

    onSubmit(value:any):void {
        //send some data to backend
    }
}
Run Code Online (Sandbox Code Playgroud)

装载-form.component.html

<div class="card card-block">
    <h3 class="card-title">Loading form</h3>

    <form (ngSubmit)="onSubmit(form.value)" [ngFormModel]="form">
        <fieldset class="form-group" [class.has-danger]="!date.valid && date.touched">
            <label class="form-control-label" for="dateInput">Date</label>
            <input type="text" class="form-control form-control-danger form-control-success" id="dateInput"
                   min="0" placeholder="Enter loading date"
                   [ngFormControl]="form.controls['date']">
        </fieldset>
        <fieldset class="form-group" [class.has-danger]="!capacity.valid && capacity.touched">
            <label class="form-control-label" for="capacityInput">Capacity</label>
            <input type="number" class="form-control form-control-danger form-control-success" id="capacityInput"
                   placeholder="Enter capacity"
                   [ngFormControl]="form.controls['capacity']">
        </fieldset>
        <button type="submit" class="btn btn-primary" [disabled]="!form.valid">Submit
        </button>
    </form>
</div>
Run Code Online (Sandbox Code Playgroud)

Gün*_*uer 106

另请参阅https://angular.io/docs/ts/latest/guide/reactive-forms.html("重置表单标志"部分)

> = RC.6

在RC.6中,应该支持更新表单模型.创建新表单组并分配给myForm

[formGroup]="myForm"
Run Code Online (Sandbox Code Playgroud)

也将得到支持(https://github.com/angular/angular/pull/11051#issuecomment-243483654)

> = RC.5

form.reset();
Run Code Online (Sandbox Code Playgroud)

在新表单模块(> = RC.5)中NgForm有一个reset()方法,并且还支持表单reset事件. https://github.com/angular/angular/blob/6fd5bc075d70879c487c0188f6cd5b148e72a4dd/modules/%40angular/forms/src/directives/ng_form.ts#L179

<= RC.3

这将有效:

onSubmit(value:any):void {
  //send some data to backend
  for(var name in form.controls) {
    (<Control>form.controls[name]).updateValue('');
    /*(<FormControl>form.controls[name]).updateValue('');*/ this should work in RC4 if `Control` is not working, working same in my case
    form.controls[name].setErrors(null);
  }
}
Run Code Online (Sandbox Code Playgroud)

也可以看看

  • @ masel.popowo是的,如果您想使用“ pristine`,...”,那么重建表格是当前的唯一选择。 (2认同)
  • 我自己还没有尝试过,但我想您只需删除控制组并创建一个新的控制组即可。将代码移动到一个函数中,以便您可以在必要时重复调用它。 (2认同)

ebh*_*001 25

从Angular2 RC5开始,myFormGroup.reset()似乎就是这样做的.


Jay*_*Kan 13

要在提交后重置表单,只需调用即可this.form.reset().通过调用reset()它将:

  1. 将控件和子控件标记为原始.
  2. 将控件和子控件标记为未触及.
  3. 将控件和子控件的值设置为自定义值null.
  4. 更新受影响方的价值/有效期/错误.

请找到此拉取请求以获得详细答案.仅供参考,此PR已合并至2.0.0.

希望这可以有所帮助,如果您对Angular2表单有任何其他问题,请告诉我.


Mau*_*rez 12

这是我在 Angular 7.3 中的做法

// you can put this method in a module and reuse it as needed
resetForm(form: FormGroup) {

    form.reset();

    Object.keys(form.controls).forEach(key => {
      form.get(key).setErrors(null) ;
    });
}
Run Code Online (Sandbox Code Playgroud)

没有必要打电话 form.clearValidators()

  • 这是清除使用带有验证器控件的 FormBuilder 构建的表单的最佳(并且仅对我有效)解决方案。 (2认同)

Rah*_*ari 9

import {Component} from '@angular/core';
import {NgForm} from '@angular/forms';
@Component({
    selector: 'example-app',
    template: '<form #f="ngForm" (ngSubmit)="onSubmit(f)" novalidate>
        <input name="first" ngModel required #first="ngModel">
        <input name="last" ngModel>
        <button>Submit</button>
    </form>
    <p>First name value: {{ first.value }}</p>
    <p>First name valid: {{ first.valid }}</p>
    <p>Form value: {{ f.value | json }}</p>
    <p>Form valid: {{ f.valid }}</p>',
})
export class SimpleFormComp {
    onSubmit(f: NgForm) {

        // some stuff

        f.resetForm();
    }
}
Run Code Online (Sandbox Code Playgroud)


Sin*_*dro 9

这是我在 Angular 8 中的做法:

获取表单的本地参考:

<form name="myForm" #myForm="ngForm"></form>
Run Code Online (Sandbox Code Playgroud)
@ViewChild('myForm', {static: false}) myForm: NgForm;
Run Code Online (Sandbox Code Playgroud)

每当您需要重置表单时,请调用resetForm方法:

this.myForm.resetForm();
Run Code Online (Sandbox Code Playgroud)

您将需要FormsModule@angular/forms它的工作。请务必将其添加到您的模块导入中。


小智 8

clearForm();在您的.ts文件中拨打电话

尝试像下面的示例代码片段一样清除表单数据。

clearForm() {

this.addContactForm.reset({
      'first_name': '',
      'last_name': '',
      'mobile': '',
      'address': '',
      'city': '',
      'state': '',
      'country': '',
       'zip': ''
     });
}
Run Code Online (Sandbox Code Playgroud)


Luc*_*ach 6

对于角度版本4,您可以使用:

this.heroForm.reset();
Run Code Online (Sandbox Code Playgroud)

但是,您可能需要一个初始值,如:

ngOnChanges() {
 this.heroForm.reset({
  name: this.hero.name, //Or '' to empty initial value. 
  address: this.hero.addresses[0] || new Address()
 });
}
Run Code Online (Sandbox Code Playgroud)

在对象引用中解决null问题很重要.

参考链接,搜索"重置表单标志".


小智 6

this.myForm.reset();

这已经足够了......你可以获得想要的输出

  • 添加更多说明这行代码如何解决问题 (3认同)