Wie lösche ich das Formular nach dem Absenden in Angular 2?


87

Ich habe eine einfache eckige 2-Komponente mit Vorlage. Wie lösche ich das Formular und alle Felder nach dem Absenden? Ich kann die Seite nicht neu laden. Nach dem Einstellen der Daten mit date.setValue('')Feld ist 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
    }
}

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

Antworten:


135

Siehe auch https://angular.io/docs/ts/latest/guide/reactive-forms.html (Abschnitt "Zurücksetzen der Formularflags")

> = RC.6

In RC.6 sollte das Aktualisieren des Formularmodells unterstützt werden. Neue Formulargruppe erstellen und zuweisenmyForm

[formGroup]="myForm"

wird ebenfalls unterstützt ( https://github.com/angular/angular/pull/11051#issuecomment-243483654 )

> = RC.5

form.reset();

Im neuen Formularmodul (> = RC.5) NgFormgibt es eine reset()Methode und unterstützt auch ein Formularereignis reset. https://github.com/angular/angular/blob/6fd5bc075d70879c487c0188f6cd5b148e72a4dd/modules/%40angular/forms/src/directives/ng_form.ts#L179

<= RC.3

Das wird funktionieren:

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

Siehe auch


2
@ masel.popowo Ja, wenn Sie möchten pristine, ..., ist die Neuerstellung des Formulars derzeit die einzige Option.
Günter Zöchbauer

@ günter-zöchbauer wie baut man das formular neu auf?
Simon Hawesome

2
Ich habe es selbst noch nicht ausprobiert, aber ich denke, Sie lassen einfach die Kontrollgruppe fallen und erstellen eine neue. Verschieben Sie den Code in eine Funktion, damit Sie ihn bei Bedarf wiederholt aufrufen können.
Günter Zöchbauer

+1 für setErrors (). Übrigens ein Fehler, den ich hier dokumentiere, ein Fehler, den ich gemacht habe, falls jemand anderes etwas Ähnliches tut: Wenn Sie einen Platzhalter verwenden, z. B. 'foo', rufen Sie nicht control.updateValue ('foo') auf, sondern rufen Sie control.setValue (null) auf.
Mike Argyriou

Ich kenne keine setValue()Kontrollmethode. Nur updateValue() github.com/angular/angular/blob/master/modules/angular2/src/…
Günter Zöchbauer

32

Ab Angular2 RC5 myFormGroup.reset()scheint der Trick zu tun.


Dies funktioniert in Winkel 4, verwendet, um die Formularvalidierungen zurückzusetzen
Grim

13

Um Ihr Formular nach dem Absenden zurückzusetzen, können Sie es einfach aufrufen this.form.reset(). Durch den Aufruf wird reset()es:

  1. Markieren Sie das Steuerelement und die untergeordneten Steuerelemente als makellos .
  2. Markieren Sie das Steuerelement und die untergeordneten Steuerelemente als unberührt .
  3. Setzen Sie den Wert von Steuerelementen und untergeordneten Steuerelementen auf benutzerdefinierten Wert oder Null .
  4. Aktualisieren Sie Wert / Gültigkeit / Fehler der betroffenen Parteien.

In dieser Pull-Anfrage finden Sie eine detaillierte Antwort. Zu Ihrer Information, diese PR wurde bereits auf 2.0.0 zusammengeführt.

Hoffentlich kann dies hilfreich sein und mich wissen lassen, wenn Sie weitere Fragen zu Angular2 Forms haben.


1
Wenn ich Reset verwende, werden keine Validierungen angewendet. Wie kann ich beide zum Laufen bringen?
Nisha

10

Rufen Sie clearForm();in Ihrer .ts-Datei an

Versuchen Sie es wie im folgenden Beispielcode-Snippet, um Ihre Formulardaten zu löschen.

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

@ Dies funktioniert gut, wenn wir alle Felder löschen müssen. Aber wie können wir dasselbe implementieren, um nur bestimmte Felder zu löschen?
Akhilesh Pothuri

8

So mache ich das in 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) ;
    });
}

Es war nicht nötig anzurufen form.clearValidators()


2
Dies ist die beste (und für mich nur funktionierende) Lösung zum Löschen von Formularen, die mit FormBuilder erstellt wurden und über Steuerelemente mit Validatoren verfügen.
mmied

7

So mache ich es Angular 8:

Holen Sie sich eine lokale Referenz Ihres Formulars:

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

Rufen Sie die resetFormMethode auf, wenn Sie das Formular zurücksetzen müssen :

this.myForm.resetForm();

Sie benötigen FormsModulevon, @angular/formsdamit es funktioniert. Stellen Sie sicher, dass Sie es zu Ihren Modulimporten hinzufügen.


1
@ViewChildin Winkel 8 benötigt 2 Argumente. @ViewChild('myForm', {static: false}) myForm: NgForm;
Tanzeel

6

Für die eckige Version 4 können Sie Folgendes verwenden:

this.heroForm.reset();

Möglicherweise benötigen Sie jedoch einen Anfangswert wie:

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

Es ist wichtig, das Nullproblem in Ihrer Objektreferenz zu beheben.

Referenz Link , Suche nach „Zurücksetzen der Form Flags“.


Danke, es funktioniert für mich. Das ist was ich will.
Dhaval Mistry


1

Ich habe eine andere Lösung gefunden. Es ist ein bisschen hackig, aber in der Welt von angle2 weit verbreitet.

Da die Direktive * ngIf das Formular entfernt und neu erstellt, kann dem Formular einfach ein * ngIf hinzugefügt und an eine formSuccessfullySentVariable gebunden werden. => Dadurch wird das Formular neu erstellt und daher der Status der Eingabesteuerung zurückgesetzt.

Natürlich müssen Sie auch die Modellvariablen löschen. Ich fand es praktisch, eine bestimmte Modellklasse für meine Formularfelder zu haben. Auf diese Weise kann ich alle Felder zurücksetzen, so einfach wie das Erstellen einer neuen Instanz dieser Modellklasse. :) :)


Ergänzung: Ich verwende AngularDart, das noch keine solche Reset-Methode hat. Zumindest habe ich es gerade nicht entdeckt. : D
Benjamin Jesuiter

Mit RC.6 reicht es aus, das Formularmodell nur neu zu initialisieren. Wenn Sie das Formularmodell in eine Methode erstellen, wird das Formular durch Aufrufen dieser Methode zurückgesetzt.
Günter Zöchbauer

@ GünterZöchbauer Oh toll! Ich kann es kaum erwarten, diese Funktion auch in Angular2 für Dart zu haben! :) Weil mein Ansatz ein Problem ist: Ich habe eine Liste aller Eingabeelemente in meinem Formular. Ich bekomme diese per Dart-Native querySelectorAllin ngAfterViewInit. Ich benutze diese Liste, um das nächste Eingabeelement auf keydown.enter zu fokussieren, anstatt das Formular zu senden. Diese Liste wird unterbrochen, wenn ngIf zum erneuten Initialisieren des Formulars verwendet wird. :(
Benjamin Jesuiter

OK, ich habe das Problem behoben. Ich kann die InputElement-Instanzen erneut abfragen, wenn ich mein Formularmodell zurücksetze.
Benjamin Jesuiter

0

Hm, jetzt (23. Januar 2017 mit Winkel 2.4.3) habe ich es so gemacht:

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

0

Der folgende Code funktioniert für mich in 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 ();

Das ist alles genug ... Sie können die gewünschte Ausgabe erhalten


1
Fügen Sie weitere Erklärungen hinzu, wie diese Codezeile das Problem
löst

0

Um das vollständige Formular beim Senden zurückzusetzen, können Sie reset () in Angular verwenden. Das folgende Beispiel ist in Angular 8 implementiert. Unten finden Sie ein Abonnementformular, in dem wir E-Mails als Eingabe verwenden.

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

Siehe offizielles Dokument: https://angular.io/guide/forms#show-and-hide-validation-error-messages .


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

Obwohl dieser Code die Frage möglicherweise beantwortet, sollten Sie eine Erklärung hinzufügen, aus der hervorgeht, warum / wie das Problem gelöst wird.
BDL

Die Klassen "berührt", "makellos" usw. werden nicht auf ihre ursprünglichen Werte zurückgesetzt.
Pac0

@Shivendra Dies kann besonders für Ihr Problem funktionieren, ist aber nicht generisch. Du machst dein objectleer und nicht das form.
Tanzeel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.