Angular 2提交后如何清空表单?

How to clear form after submit in Angular 2?

我有一些带模板的简单 angular 2 组件。提交后如何清除表单和所有字段?我无法重新加载页面。 使用 date.setValue('') 字段设置数据后仍然是 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
    }
}

加载中-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>

另请参阅 https://angular.io/docs/ts/latest/guide/reactive-forms.html(部分 "reset the form flags")

>=RC.6

RC.6应该支持更新表单模型。创建一个新的表单组并分配给 myForm

[formGroup]="myForm"

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

>=RC.5

form.reset();

在新的表单模块 (>= 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);
  }
}

另见

有新的讨论(https://github.com/angular/angular/issues/4933). So far there is only some hacks that allows to clear the form, like recreating the whole form after submitting: https://embed.plnkr.co/kMPjjJ1TWuYGVNlnQXrU/

从 Angular2 RC5 开始,myFormGroup.reset() 似乎可以解决问题。

我找到了另一个解决方案。它有点 hacky 但它在 angular2 世界中广泛使用。

由于 *ngIf 指令会删除表单并重新创建它,因此可以简单地将 *ngIf 添加到表单并将其绑定到某种 formSuccessfullySent 变量。 => 这将重新创建表单并因此重置输入控件状态。

当然,你也必须清除模型变量。我发现为我的表单字段设置特定模型 class 很方便。这样我就可以像创建这个模型的新实例一样简单地重置所有字段 class。 :)

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

  1. 将控件和子控件标记为 pristine
  2. 将控件和子控件标记为未修改
  3. 将控件和子控件的值设置为自定义值null.
  4. 更新 value/validity/errors 受影响方。

请找到此 pull request 以获得详细答案。仅供参考,此 PR 已合并到 2.0.0。

希望这对您有所帮助,如果您对 Angular2 Forms 有任何其他问题,请告诉我。

嗯,现在(2017 年 1 月 23 日与 angular 2.4.3)我让它像这样工作:

newHero() {
    return this.model = new Hero(42, 'APPLIED VALUE', '');
}
<button type="button" class="btn btn-default" (click)="heroForm.resetForm(newHero())">New Hero</button>
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();
    }
}
resetForm(){
    ObjectName = {};
}

到angular版本4,你可以使用这个:

this.heroForm.reset();

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

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

解决对象引用中的空问题很重要。

参考 link,搜索 "reset the form flags"。

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

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

clearForm() {

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

这是我在 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) ;
    });
}

不需要调用 form.clearValidators()

下面的代码适用于 Angular 4

import { FormBuilder, FormGroup, Validators } from '@angular/forms';
export class RegisterComponent implements OnInit {
 registerForm: FormGroup; 

 constructor(private formBuilder: FormBuilder) { }   

 ngOnInit() {
    this.registerForm = this.formBuilder.group({
      empname: [''],
      empemail: ['']
    });
 }

 onRegister(){
    //sending data to server using http request
    this.registerForm.reset()
 }

}

这是我的做法 Angular 8:

获取表单的本地参考:

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

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

this.myForm.resetForm();

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

this.myForm.reset();

这就够了...你可以得到想要的输出

要在提交时重置完整的表单,您可以使用 Angular 中的 reset()。下面的例子是在 Angular 8 中实现的。 下面是一个订阅表单,我们将电子邮件作为输入。

<form class="form" id="subscribe-form" data-response-message-animation="slide-in-left" #subscribeForm="ngForm"
(ngSubmit)="subscribe(subscribeForm.value); subscribeForm.reset()">
<div class="input-group">
   <input type="email" name="email" id="sub_email" class="form-control rounded-circle-left"
      placeholder="Enter your email" required ngModel #email="ngModel" email>
   <div class="input-group-append">
      <button class="btn btn-rounded btn-dark" type="submit" id="register"
         [disabled]="!subscribeForm.valid">Register</button>
   </div>
</div>
</form>

参考官方文档:https://angular.io/guide/forms#show-and-hide-validation-error-messages