Jak wyczyścić formularz po przesłaniu w Angular 2?


87

Mam prosty komponent kątowy 2 z szablonem. Jak wyczyścić formularz i wszystkie pola po przesłaniu? Nie mogę ponownie załadować strony. Po ustawieniu danych z date.setValue('')polem nadal 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>

Odpowiedzi:


135

Zobacz też https://angular.io/docs/ts/latest/guide/reactive-forms.html (sekcja „resetowanie flag formularzy”)

> = RC.6

W RC.6 powinna być obsługiwana aktualizacja modelu formularza. Tworzenie nowej grupy formularzy i przypisywanie domyForm

[formGroup]="myForm"

będzie również obsługiwany ( https://github.com/angular/angular/pull/11051#issuecomment-243483654 )

> = RC.5

form.reset();

W nowym module formularzy (> = RC.5) NgFormma reset()metodę i obsługuje również resetzdarzenie formularzy . https://github.com/angular/angular/blob/6fd5bc075d70879c487c0188f6cd5b148e72a4dd/modules/%40angular/forms/src/directives/ng_form.ts#L179

<= RC.3

To zadziała:

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

Zobacz też


2
@ masel.popowo Tak, jeśli chcesz pristine, ... to przebudowanie formularza jest obecnie jedyną opcją.
Günter Zöchbauer

@ günter-zöchbauer jak odbudować formularz?
SimonHawesome,

2
Sam jeszcze tego nie próbowałem, ale wydaje mi się, że po prostu porzuciłeś grupę kontrolną i utworzyłeś nową. Przenieś kod do funkcji, aby w razie potrzeby móc ją wielokrotnie wywoływać.
Günter Zöchbauer

+1 dla setErrors (). Swoją drogą, opisuję tutaj błąd, który popełniłem na wypadek, gdyby ktoś inny zrobił coś podobnego: w przypadku użycia symbolu zastępczego, np. 'Foo', nie wywołuj control.updateValue ('foo'), ale zamiast tego wywołaj control.setValue (null)
Mike Argyriou

Nie znam setValue()metody kontroli. Tylko updateValue() github.com/angular/angular/blob/master/modules/angular2/src/…
Günter Zöchbauer

32

Od Angular2 RC5 myFormGroup.reset()wydaje się , że załatwia sprawę .


działa to w kątowym 4, użyłem go do zresetowania walidacji formularza
Ponury

13

Aby zresetować formularz po przesłaniu, możesz po prostu wywołać this.form.reset(). Dzwoniąc do reset()niej:

  1. Oznacz kontrolkę i kontrolki podrzędne jako nieskazitelne .
  2. Oznacz formant i kontrolki podrzędne jako nietknięte .
  3. Ustaw wartość kontrolki i kontrolek podrzędnych na wartość niestandardową lub null .
  4. Zaktualizuj wartość / ważność / błędy stron, których dotyczy problem.

Znajdź to żądanie ściągnięcia szczegółową odpowiedź, . FYI, ten PR został już połączony z wersją 2.0.0.

Mam nadzieję, że może to być pomocne i daj mi znać, jeśli masz inne pytania dotyczące Angular2 Forms.


1
jeśli używam resetowania, walidacje nie są stosowane. jak mogę sprawić, by oba działały?
Nisha

10

Nawiąż połączenie clearForm();w pliku .ts

Spróbuj jak poniżej przykładowy fragment kodu, aby wyczyścić dane formularza.

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

@ Działa to dobrze, gdy musimy wyczyścić wszystkie pola. Ale jak możemy zastosować to samo, aby wyczyścić tylko niektóre pola?
Akhilesh Pothuri

8

Oto jak to robię w 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) ;
    });
}

Nie było potrzeby dzwonić form.clearValidators()


2
To najlepsze (i tylko dla mnie działające) rozwiązanie do czyszczenia formularza zbudowanego za pomocą FormBuilder, który ma kontrolki z walidatorami.
mmied

7

Oto jak to robię Angular 8:

Uzyskaj lokalny numer referencyjny swojego formularza:

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

A kiedy potrzebujesz zresetować formularz, wywołaj resetFormmetodę:

this.myForm.resetForm();

Aby to zadziałało, będziesz potrzebować FormsModuleod @angular/forms. Pamiętaj, aby dodać go do importu modułu.


1
@ViewChildw Angular 8 potrzebuje 2 argumentów. @ViewChild('myForm', {static: false}) myForm: NgForm;
Tanzeel

6

W wersji kątowej 4 możesz użyć tego:

this.heroForm.reset();

Ale możesz potrzebować wartości początkowej, takiej jak:

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

Ważne jest, aby rozwiązać problem zerowy w odwołaniu do obiektu.

odnośnik do odnośnika , Wyszukaj hasło „resetuj flagi formularza”.


Dziękuję, to działa dla mnie. To jest to czego chcę.
Dhaval Mistry


1

Znalazłem inne rozwiązanie. Jest trochę hacky, ale jest szeroko dostępny w świecie angular2.

Ponieważ dyrektywa * ngIf usuwa formularz i odtwarza go, można po prostu dodać * ngIf do formularza i powiązać go z jakimś rodzajem formSuccessfullySent zmienną. => Spowoduje to odtworzenie formularza i tym samym zresetuje stany sterowania wejściami.

Oczywiście musisz również wyczyścić zmienne modelu. Uważam, że wygodnie jest mieć określoną klasę modelu dla moich pól formularza. W ten sposób mogę zresetować wszystkie pola tak proste, jak utworzenie nowej instancji tej klasy modelu. :)


Dodatek: używam AngularDart, który nie ma jeszcze takiej metody resetowania. A przynajmniej nie odkryłem tego teraz. : D
Benjamin Jesuiter

Z RC.6 wystarczy ponowna inicjalizacja modelu formularzy. Jeśli przenosisz tworzenie modelu formularzy do metody, wywołanie tej metody spowoduje zresetowanie formularza.
Günter Zöchbauer

@ GünterZöchbauer Och, świetnie! Nie mogę się doczekać, aby mieć tę funkcję również w Angular2 for Dart! :) Ponieważ moje podejście jako problem: mam listę wszystkich elementów wejściowych w moim formularzu. Dostaję je przez natywną rzutkę querySelectorAllw ngAfterViewInit. Używam tej listy, aby skupić się na następnym elemencie wejściowym na keydown.enter, zamiast przesyłać formularz. Ta lista nie działa, gdy używasz ngIf do ponownej inicjalizacji formularza. :(
Benjamin Jesuiter

OK, rozwiązałem problem. Mogę ponownie wysyłać zapytania do instancji InputElement po zresetowaniu modelu formularza.
Benjamin Jesuiter

0

Hm, teraz (23 stycznia 2017 z kątowym 2.4.3) zrobiłem to tak:

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

0

Poniższy kod działa u mnie w 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 ();

To wystarczy ... Możesz uzyskać pożądany efekt


1
Dodaj więcej wyjaśnień, w jaki sposób ta linia kodu rozwiązuje problem
Sfili_81

0

Aby zresetować cały formularz po przesłaniu, możesz użyć reset () w Angular. Poniższy przykład jest zaimplementowany w Angular 8. Poniżej znajduje się formularz subskrypcji, w którym przyjmujemy e-mail jako dane wejściowe.

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

Zobacz oficjalny dokument: https://angular.io/guide/forms#show-and-hide-validation-error-messages .


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

Chociaż ten kod może odpowiedzieć na pytanie, powinieneś dodać wyjaśnienie określające, dlaczego / jak rozwiązuje problem.
BDL

nie przywraca klas „dotkniętych”, „nieskazitelnych” itp. ich oryginalnych wartości.
Pac0

@Shivendra Może to działać szczególnie w przypadku twojego problemu, ale nie jest to ogólne. Robisz swoje objectpuste, a nie form.
Tanzeel
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.