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>
masel.popowo
źródło

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ż

Günter Zöchbauer
źródło
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ę .

ebhh2001
źródło
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.

JayKan
źródło
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': ''
     });
}
mkumar0304
źródło
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();
    }
}
Rahul Tiwari
źródło
@ 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()

Mauricio Gracia Gutierrez
źródło
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.

Sinandro
źródło
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”.

Lucas Selliach
źródło
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. :)

Benjamin Jesuiter
źródło
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>
adrhc
źródło
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()
 }

}
Thavaprakash Swaminathan
źródło
0

this.myForm.reset ();

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

Manikanta Sai
źródło
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 .

Abhishek Aggarwal
źródło
-3
resetForm(){
    ObjectName = {};
}
Shivendra
źródło
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