Як очистити форму після подання в Angular 2?


87

У мене є якийсь простий кутовий 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
    }
}

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>

Відповіді:


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()метод, а також підтримує 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
@ masel.popowo Так, якщо ви хочете pristine, ..., то відновлення форми на сьогодні є єдиним варіантом.
Günter Zöchbauer

@ günter-zöchbauer як ви відновлюєте форму?
SimonHawesome 02.03.16

2
Я ще не пробував, але, мабуть, ви просто скидаєте контрольну групу і створюєте нову. Перемістіть код до функції, щоб ви могли викликати його неодноразово, якщо це необхідно.
Günter Zöchbauer 02.03.16

+1 для setErrors (). До речі, помилку я документую тут, помилку, яку я допустив на випадок, якщо хтось зробить щось подібне: якщо ви використовуєте заповнювач, наприклад 'foo', не викликайте control.updateValue ('foo'), а натомість викликайте control.setValue (null)
Mike Argyriou

Я не знаю про setValue()метод контролю. Тільки updateValue() github.com/angular/angular/blob/master/modules/angular2/src/…
Günter Zöchbauer

32

Щодо Angular2 RC5, myFormGroup.reset()схоже, робить трюк.


це працює в кутовому 4, використовував його для скидання перевірок форми
Grim

13

Щоб скинути форму після надсилання, ви можете просто викликати this.form.reset(). Зателефонувавши reset()це буде:

  1. Позначте елементи керування та дитячі елементи керування як незаймані .
  2. Позначте елементи керування та дочірні елементи як недоторкані .
  3. Встановіть для елемента керування та дочірніх елементів керування значення користувача або значення null .
  4. Значення оновлення / обгрунтованість / помилки постраждалих сторін.

Будь ласка, знайдіть цей запит на отримання детальної відповіді. FYI, цей PR вже об’єднано з 2.0.0.

Сподіваємось, це може бути корисним і повідомте мене, якщо у вас виникнуть інші запитання щодо форм Angular2.


1
якщо я використовую скидання, то перевірки не застосовуються. як я можу змусити обидва працювати?
Ніша,

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, який має елементи керування за допомогою валідаторів.
mmied

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

3

Про це відбувається нова дискусія ( https://github.com/angular/angular/issues/4933 ). Поки що є лише деякі хакі, які дозволяють очистити форму, наприклад, відтворити всю форму після подання: https://embed.plnkr.co/kMPjjJ1TWuYGVNlnQXrU/


1
І нарешті, у нас є метод зробити це правильно: github.com/angular/angular/pull/9974
wawka

1

Я знайшов інше рішення. Це трохи хакі, але він широко доступний у світі angular2.

Оскільки директива * ngIf видаляє форму і відтворює її, можна просто додати * ngIf до форми і прив'язати її до якоїсь formSuccessfullySentзмінної. => Це створить форму і, отже, скине статуси вхідного контролю.

Звичайно, вам доведеться також очистити змінні моделі. Мені було зручно мати певний клас моделі для моїх полів форми. Таким чином я можу скинути всі поля так просто, як створення нового екземпляра цього класу моделі. :)


Додаток: я використовую AngularDart, який ще не має такого методу скидання. Або принаймні я не знайшов цього прямо зараз. : D
Бенджамін Єзуїт

З RC.6 підійде лише повторна ініціалізація моделі форм. Якщо ви перейдете до створення форми форм до методу, виклик цього методу скине форму.
Günter Zöchbauer

@ GünterZöchbauer О, чудово! Я не можу дочекатися, коли цю функцію в Angular2 для Dart теж буду! :) Тому що мій підхід як проблема: у мене є перелік усіх вхідних елементів у моїй формі. Я отримую їх через dart-native querySelectorAllin ngAfterViewInit. Я використовую цей список, щоб зосередити наступний елемент введення на keydown.enter, замість того, щоб подавати форму. Цей список ламається при використанні ngIf для повторної ініціалізації форми. :(
Бенджамін Єзуїт

Добре, я вирішив проблему. Я можу зробити повторний запит до екземплярів InputElement, коли скидаю модель форми.
Бенджамін Єзуїт

0

Хм, зараз (23 січня 2017 року з кутовим 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

Щоб скинути повну форму після надсилання, ви можете використовувати reset () у Angular. Наведений нижче приклад реалізований в 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

він не повертає класи "доторкнувся", "первозданний" тощо ... до початкових значень.
Pac0,

@Shivendra Це може працювати особливо для вашої проблеми, але не є загальним. Ви робите своє objectпорожнє, а не те form.
Tanzeel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.