2017-08-31 1 views
1

Ich lerne Angular4 spezifischere reaktive Formen. Ich habe die Heroes-Demo laufen lassen und bin auf etwas stecken geblieben.Wie setze ich eine FormGroup von Angular4 auf ihren ursprünglichen Zustand zurück?

Auf diesem Plunker müssen wir einen Superhelden auswählen, und es wird die Adresse des Helden zeigen. Ich habe eine Reset-Taste für jede Adresse hinzugefügt, aber wenn ich auf eine Adresse klicke, wird alles zurückgesetzt.

Im Beispiel haben wir:

createForm() { //Set up form and array of addresses 
    this.heroForm = this.fb.group({ 
     name: '', 
     secretLairs: this.fb.array([]), 
     power: '', 
     sidekick: '' 
    }); 
    } 

    //Function to revert changes 
    revert() { this.ngOnChanges(); } 

    //This function will set the name from original object 
    ngOnChanges() { 
    this.heroForm.reset({ 
     name: this.hero.name 
    }); 

    //It will reload the form array with original values 
    this.setAddresses(this.hero.addresses); 
    } 

    //Create new formgroups and add to formArray 
    setAddresses(addresses: Address[]) { 
    const addressFGs = addresses.map(address => this.fb.group(address)); 
    const addressFormArray = this.fb.array(addressFGs); 
    this.heroForm.setControl('secretLairs', addressFormArray); 
    } 

Diese Ordnung ist, es funktioniert, aber es wird das gesamte Formular zurückgesetzt. Zum Beispiel hat Whirlwind zwei Adressen. Ich habe eine neue Adresse hinzugefügt, und danach ändere ich die erste Adresse. Ich mache einen Fehler und möchte die ursprünglichen Werte erhalten, ich klicke auf den Reset-Knopf, und es wird meine neue Adresse entfernen, und es wird alle Daten auf dem Formular zurücksetzen.

Wie kann ich pro Adresse und nicht das gesamte Formular zurücksetzen?

Dank

+1

Warum rufst du auch einen Reset auf Änderungen? Ich bin mir nicht sicher, ob ich verstehe, was Sie erreichen wollen. Wie wäre es mit einem User-Story-Beispiel? Was passiert und was erwarten Sie? –

+0

Ich entschuldige mich, wenn es etwas verpasst hat. Ich möchte die vorgenommenen Änderungen rückgängig machen und die vorherigen Werte laden. Zum Beispiel lädt es die erste Adresse und ich fange an, dort etwas einzugeben. Wenn ich auf Zurücksetzen klicke, werden die ursprünglichen Werte für diese spezifische Adresse und nicht für das gesamte Formular angezeigt. – UncleFester

Antwort

1

Sie value oder getRawValue() verwenden können, um die Werte nach der Initialisierung zu lesen.

Nach reset() können Sie dann die Anfangswerte zurücksetzen, indem Sie setValue() mit den zuvor gelesenen Werten verwenden.

Siehe

+1

Ich dachte, dass ich das nach Element in Array tun könnte, aber es scheint, wir müssen die gesamte FormGroup richtig binden? – UncleFester

+0

Von dem, was ich gesehen habe, können Sie entweder "Reset" verwenden und alle ursprünglichen Daten übergeben ... oder Sie können 'setValue' oder' patchValue' verwenden. Auch ... Ich verstehe, dass "Reset" * nicht * derzeit die richtige Anzahl von FormArray-Elementen bei einem Reset erstellt. Es gibt ein Problem dafür im Angular Github Repo. Wenn Sie wirklich nur einen Wert zurücksetzen möchten, dann ist 'patchValue' möglicherweise das, was Sie wollen. – DeborahK

+1

Und wenn Sie interessiert sind, habe ich eine Beispielanwendung mit reaktiven Formen hier: https://github.com/DeborahK/Angular2-ReactiveForms (im APM-Ordner). Er verwendet 'patchValue', um die Daten im Formular jedes Mal zu aktualisieren, wenn der Benutzer ein neues Element zum Bearbeiten auswählt. Sie können eine ähnliche Technik zum Zurücksetzen verwenden. – DeborahK

Verwandte Themen