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


87

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

loading-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>

Answers:


135

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

> = RC.6

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

[formGroup]="myForm"

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

> = RC.5

form.reset();

在新的表单模块中(> = RC.5)NgForm具有一个reset()方法,并且还支持一个formsreset事件。 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);
  }
}

也可以看看


2
@ masel.popowo是的,如果您需要pristine...,那么重建表格是当前的唯一选择。
君特Zöchbauer

@günter-zöchbauer您如何重建表格?
SimonHawesome

2
我还没有尝试过,但是我猜您只是删除了对照组并创建了一个新的对照组。将代码移至某个函数,以便在必要时可以重复调用它。
君特Zöchbauer

为setErrors()+1。顺便说一句,我在这里记录了一个错误,如果有人做类似的事情,我犯了一个错误:如果使用占位符,例如'foo',请不要调用control.updateValue('foo'),而要调用control.setValue(null)
Mike Argyriou

我不知道setValue()控制方法。只有updateValue() github.com/angular/angular/blob/master/modules/angular2/src/...
君特Zöchbauer

32

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


这在角度4中起作用,用它来重置表单验证
Grim

13

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

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

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

希望这对您有所帮助,如果您对Angular2 Forms有其他疑问,请与我们联系。


1
如果我使用reset则不应用验证。如何使两者都起作用?
Nisha

10

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

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

clearForm() {

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

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

@当我们必须清除所有字段时,这很好用。但是,我们如何实现相同的功能以仅清除某些字段?
Akhilesh Pothuri,

8

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


2
这是清除由FormBuilder构建的带有验证器控件的表单的最佳解决方案(并且仅对我有用)。
9:04

7

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

获取您的表格的本地参考:

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

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

this.myForm.resetForm();

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


1
@ViewChild在Angular 8中需要2个参数。@ViewChild('myForm', {static: false}) myForm: NgForm;
Tanzeel

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

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

参考链接,搜索“重置表单标志”。


谢谢,它为我工作。这就是我要的。
Dhaval Mistry


1

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

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

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


另外:我正在使用AngularDart,它还没有这样的重置方法。或者至少我现在没有发现它。:D
本杰明·耶稣会

使用RC.6,只需重新初始化表单模型即可。如果将创建表单模型移至某个方法,则调用此方法将重置该表单。
君特Zöchbauer

@GünterZöchbauer太好了!我也迫不及待想在Angular2 for Dart中拥有此功能!:)因为我的方法有问题:我在表单中列出了所有输入元素。我得到这些通过镖原生querySelectorAllngAfterViewInit。我使用此列表将下一个输入元素集中在keydown.enter上,而不是提交表单。使用ngIf重新初始化表单时,此列表中断。:(
本杰明·耶稣会

好,我解决了这个问题。重置表单模型后,我可以重新查询InputElement实例。
本杰明·耶稣会教堂'16

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>

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

}

0

this.myForm.reset();

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


1
添加更多说明,此行代码如何解决问题
Sfili_81

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


-3
resetForm(){
    ObjectName = {};
}

尽管此代码可能会回答问题,但是您应该添加说明,说明为什么/如何解决问题。
BDL

它不会将“ touched”,“ pristine”等类设置回其原始值。
Pac0

@Shivendra这可能特别适合您的问题,但不是通用的。您是在object空着而不是在空form
Tanzeel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.