2016-02-23 5 views
15

Ich habe ein Problem Aufbau dynamische angular2 Formen mit Kontrollen und Auswahlbox, diese zum Beispiel plunker:Angular2 Update-Formular Steuerwert

<select class="form-control" ngControl="power"> 
     <option *ngFor="#p of powers" [value]="p">{{p}}</option> 
    </select> 

Sie einen Helden Leistung auswählen und die Steuerung den gleichen Wert haben . Wenn Sie jedoch Change Powers drücken, wäre der ausgewählte Wert null, aber der Kontrollwert ist immer noch der alte Wert. Dies ist ein ernsthaftes Problem, das ich denke, da dies eine Quelle für viele Bugs ist, wenn das Formular eine Sache zeigt, aber in Wirklichkeit wird es etwas anderes vorschlagen, gibt es eine Möglichkeit, den Inhalt des Steuerelements zu aktualisieren? Es gibt updateValue(), aber Sie müssen den Wert in all diesen Fällen manuell einstellen.

Es gibt auch einen ähnlichen Fall, wenn Sie die Selectbox-Optionen nach dem Formularaufbau aktualisieren, wird es einen ausgewählten Wert in der ausgewählten Box anzeigen, während der Steuerwert wäre Null, irgendwelche Ideen, wie damit umzugehen?

+1

Mögliche Duplikat [Angular2 - manuell eingestellte Wert für Formbuilder Control] (http://stackoverflow.com/questions/35039610/angular2-manually-set-value-for-formbuilder-control) –

Antwort

5

Derzeit ist dies das einzige, was Sie tun können (wie in der Frage erwähnt)

this.form.controls['power'].updateValue(null); 

Es ist eine offene Frage einer Form https://github.com/angular/angular/issues/4933

Es gibt auch eine Pull-Anforderung zurückgesetzt werden kann, aber das erlaubt Ihnen auch, es "manuell" für jede Steuerung zu setzen, aber erlaubt auch, Zustände wie ursprünglich, berührt zurückzusetzen, ... https://github.com/angular/angular/pull/6679

+0

Wie gesagt Das Problem mit 'updateValue()' ist, dass jedes Mal in einem Formular ich dynamische Elemente habe, sollte ich jeden Wert damit aktualisieren? Formular-Reset ist eine andere Sache, ich brauche alle Werte in einer komplexen Form, um auf dem neuesten Stand zu sein, nicht um es zurückzusetzen :) – Silencer

+0

Das ist, was wir derzeit haben. Sie könnten versuchen, ein "Change" -Ereignis von jedem Steuerelement auszulösen, um das Formularmodell aktualisiert zu bekommen. –

+0

Fügen Sie bitte Ihren vorherigen Kommentar zu der Antwort hinzu, das war die Sache, die ich gefragt habe. Verdammt, das sind schlechte Nachrichten ... – Silencer

1

Sie können versuchen, Formart unveränderlich zu behalten. Wenn Sie es zurücksetzen müssen, erstellen Sie es einfach neu. Auf diese Weise können Sie sicher sein, dass es auf dem neuesten Stand ist. Sie können die Werte auch irgendwo speichern und das Formular auf diese Werte zurücksetzen. Sagen Sie ein Element bearbeiten, wenn Sie setzen Sie auf die ursprünglichen Werte zurückgesetzt, nicht nur ein leeres Formular ...

export class TheForm { 
    public form: ControlGroup; 
    public controls = (value: any = {}) => ({ 
    'id': [value.id], 
    'name': [value.name, Validators.required] 
    }); 

    constructor() { 
    let values = some_values_from_database || {}; 
    this.build(values); 
    } 

    build(value) { 
    this.form = this._builder.group(this.controls(value)); 
    } 

    submit() { 
    console.log(this.form.value); 
    } 
} 

ich die Grundform erstellt haben, die diese Art von Funktionalität Griffe mit @ngrx/store, hier ist the Gist. Wenn ich ein Formular für anderes Modell benötigen, ich BaseForm verlängern würde und controls und submit() Methode nur definieren, der Rest wird geerbt ...

+0

Was passiert, wenn die aktualisierten Selectbox-Werte nicht den Controller-Wert enthalten? – Silencer

17

In Angular 2 Final (RC5 +) gibt es neue APIs für Formularwerte zu aktualisieren. Die patchValue() API-Methode unterstützt partielles Form-Updates, wo wir brauchen, um nur einige der Felder angeben:

this.form.patchValue({id: selected.id}) 

Es gibt auch die setValue() API-Methode, die ein Objekt mit allen Formularfeldern benötigt. Wenn ein Feld fehlt, erhalten wir einen Fehler.

+4

Nur um hinzuzufügen, dass 'updateValue' (von einer der ersten Antworten) zu Gunsten von' setValue' veraltet ist – superjos

+1

@superjos Sie haben keine Ahnung, wie lange ich nach diesen Informationen gesucht habe und hier wurde es in einem Kommentar begraben eine Antwort. Nichts im Changelog. – chap

+1

Yep, es war (ist?) Völlig nicht hervorgehoben – superjos

0

Der Code ist:

(<FormControl>this.form.controls['power']).updateValue(data); 
+0

FYI Das funktioniert nicht mehr in Angular 4 (möglicherweise früher). – msanford

6

aktualisieren

zum neuesten Update der angular2 Syntax wird wie dieser

this.form.controls['power'].setValue('anthing here'); 
+0

lässt mich sagen, dass ich eine Direktive habe, die eine Eingabe durch ein Widget ersetzt ... Wie kann meine Direktive Zugriff auf das 'form' oder formControl Objekt erhalten? –

+0

Ist es möglich, einen Wert in einem verschachtelten Formular zu aktualisieren und die übergeordnete Komponente zu aktualisieren? –

+1

vielen Dank. du hast meinen Tag gerettet . – Deepa

1

[Angular 2 Stable]

Hier ist ein schmutziges Weg nur mit NgModel (und ohne andere Form Builder oder Form-Group-Module zu importieren)

// 
// set form field, "foo" value to "bar" 
// 

// 
// view 
// 
<form #formRef="ngForm"> 
    <input name="foo" [(ngModel)]="foo"></input> 
</form> 

// 
// controller 
// 
class { 
    @ViewChild('formRef') form: NgModel; 

    ngAfterViewInit() { 
     setTimeout(() => { 
      this.form['controls']['foo'].setValue('bar'); 
     }); 
    } 
}