Подтвердить что ты не робот

Как очистить форму после отправки в 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>
4b9b3361

Ответ 1

См. также https://angular.io/docs/ts/latest/guide/reactive-forms.html (раздел "reset флаги формы" )

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

См. также

Ответ 2

Как и у Angular2 RC5, myFormGroup.reset(), похоже, делает трюк.

Ответ 3

В reset вашу форму после отправки вы можете просто вызвать this.form.reset(). Вызывая reset(), он будет:

  • Отметьте элемент управления и дочернего элемента как нетронутый.
  • Пометьте элемент управления и дочерние элементы как нетронутый.
  • Задайте для элемента управления и дочерних элементов значение пользовательское значение или значение null.
  • Обновить значение/достоверность/ошибки затронутых сторон.

Этот тянуть запрос для получения подробного ответа. FYI, этот PR уже был объединен с 2.0.0.

Надеюсь, это может быть полезно, и дайте мне знать, если у вас есть другие вопросы относительно форм Angular2.

Ответ 4

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

Ответ 5

Для угловой версии 4 вы можете использовать это:

this.heroForm.reset();

Но вам может понадобиться начальное значение, например:

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

Важно разрешить нулевую проблему в вашей ссылке на объект.

Ссылка ссылка, поиск "сбросить флаги формы".

Ответ 6

Сделайте вызов clearForm(); в файле .ts

Попробуйте сделать снимок фрагмента кода, чтобы очистить данные формы.

clearForm() {

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

Ответ 8

Я нашел другое решение. Это немного хакерский, но его широко доступный в мире angular2.

Так как директива * ngIf удаляет форму и воссоздает ее, ее можно просто добавить в форму и привязать ее к некоторой переменной formSuccessfullySent. = > Это приведет к воссозданию формы и, следовательно, reset состояниям управления вводом.

Конечно, вы также должны очистить модельные переменные. Мне было удобно иметь определенный класс модели для моих полей формы. Таким образом, я могу reset все поля так же просто, как создать новый экземпляр этого класса модели.:)

Ответ 9

Hm, теперь (23 января 2017 года с 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>

Ответ 10

Вот как я это делаю в 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

Ниже код работает для меня в 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

Вот как я это делаю Angular 8:

Получите местную ссылку вашей формы:

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

А когда вам нужно сбросить форму, вызывайте метод resetForm:

this.myForm.resetForm();

Для работы вам понадобится FormsModule из @angular/forms. Обязательно добавьте его в свой модуль импорта.

Ответ 13

resetForm(){
    ObjectName = {};
}