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

时间:2016-01-12 11:07:42

标签: angular angular2-forms

我有一些带模板的简单角度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
    }
}

放入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>

15 个答案:

答案 0 :(得分:93)

另见https://angular.io/docs/ts/latest/guide/reactive-forms.html(“重置表格标志”部分)

<强>&GT; = RC.6

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

[formGroup]="myForm"

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

<强>&GT; = RC.5

form.reset();

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

<强>&LT = 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);
  }
}

另见

答案 1 :(得分:23)

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

答案 2 :(得分:13)

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

  1. 将控件和子控件标记为 pristine
  2. 将控件和子控件标记为未触及
  3. 将控件和子控件的值设置为自定义值 null
  4. 更新受影响方的值/有效期/错误
  5. 请查看此pull request以获取详细答案。仅供参考,此PR已合并至2.0.0。

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

答案 3 :(得分:8)

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();
    }
}

答案 4 :(得分:6)

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

this.heroForm.reset();

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

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

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

引用link,搜索“重置表单标志”。

答案 5 :(得分:3)

有关于此的新讨论(https://github.com/angular/angular/issues/4933)。到目前为止,只有一些黑客可以清除表单,比如在提交后重新创建整个表单:https://embed.plnkr.co/kMPjjJ1TWuYGVNlnQXrU/

答案 6 :(得分:3)

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

尝试使用以下示例代码段来清除表单数据。

clearForm() {

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

答案 7 :(得分:1)

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

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

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

答案 8 :(得分:1)

这是我在Angular 8中的操作方式:

获取您的表格的本地参考

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

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

this.myForm.resetForm();

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

答案 9 :(得分:0)

嗯,现在(2017年1月23日,角度为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>

答案 10 :(得分:0)

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

答案 11 :(得分:0)

以下代码在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()
 }

}

答案 12 :(得分:0)

this.myForm.reset();

这已经足够了...您可以获得所需的输出

答案 13 :(得分:0)

要在提交时重置完整表单,可以在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

答案 14 :(得分:-2)

resetForm(){
    ObjectName = {};
}