Das macht mich verrückt, ich bin unter der Waffe und kann es mir nicht leisten, einen weiteren ganzen Tag damit zu verbringen.
Ich versuche, einen Steuerwert ('dept') innerhalb der Komponente manuell festzulegen, und es funktioniert einfach nicht - selbst die neuen Wertprotokolle werden ordnungsgemäß konsolidiert.
Hier ist die FormBuilder-Instanz:
initForm() {
this.form = this.fb.group({
'name': ['', Validators.required],
'dept': ['', Validators.required],
'description': ['', Validators.required],
});
}
Dies ist der Ereignishandler, der die ausgewählte Abteilung empfängt:
deptSelected(selected: { id: string; text: string }) {
console.log(selected) // Shows proper selection!
// This is how I am trying to set the value
this.form.controls['dept'].value = selected.id;
}
Jetzt, wenn das Formular gesendet wird und ich mich abmelde, ist this.form
das Feld immer noch leer! Ich habe andere Benutzer gesehen, updateValue()
aber dies ist Beta.1 und ich sehe das nicht als gültige Methode, um das Steuerelement aufzurufen.
Ich habe auch versucht, updateValueAndValidity()
ohne Erfolg anzurufen :(.
Ich würde nur ngControl="dept"
für das Formularelement verwenden, wie ich es mit dem Rest des Formulars mache, aber es ist eine benutzerdefinierte Direktive / Komponente.
<ng-select
[data]="dept"
[multiple]="false"
[items]="depts"
(selected)="deptSelected($event)" <!-- This is how the value gets to me -->
[placeholder]="'No Dept Selected'"></ng-select>
quelle
Antworten:
Aktualisiert: 19/03/2017
ALT:
Im Moment sind wir gezwungen, eine Typbesetzung durchzuführen:
Nicht sehr elegant stimme ich zu. Hoffe, dass dies in zukünftigen Versionen verbessert wird.
quelle
(<Control>this.form.controls['dept']).setErrors(null)
this.form.get('dept').setValue(selected.id)
:)this.form.controls.dept.setValue(selected.id);
this.form.controls['dept'].setValue(selected.id);
In Angular 2 Final (RC5 +) gibt es neue APIs zum Aktualisieren von Formularwerten. Die
patchValue()
API-Methode unterstützt teilweise Formularaktualisierungen, bei denen nur einige der Felder angegeben werden müssen:Es gibt auch die
setValue()
API-Methode, die ein Objekt mit allen Formularfeldern benötigt. Wenn ein Feld fehlt, wird eine Fehlermeldung angezeigt.quelle
updateValue
(aus der akzeptierten Antwort von Filoche) zugunsten vonsetValue
updateValue()
und Einführung vonpatchValue
undsetValue
.Aangular 2 final hat APIs aktualisiert. Sie haben viele Methoden dafür hinzugefügt.
Gehen Sie folgendermaßen vor, um das Formularsteuerelement vom Controller zu aktualisieren:
Die Fehler müssen nicht zurückgesetzt werden
Verweise
https://angular.io/docs/ts/latest/api/forms/index/FormControl-class.html
https://toddmotto.com/angular-2-form-controls-patch-value-set-value
quelle
setValue()
Wenn a aufgerufen wirdformGroup/formBuilder
, müssen alle Werte unter dem Formular festgelegt werden.patchValue()
kann bei gleichem Aufruf zum Aktualisieren bestimmter Werte verwendet werden.Mit den folgenden Methoden können Sie den Wert eines reaktiven Formularsteuerelements aktualisieren. Jede der folgenden Methoden entspricht Ihren Anforderungen.
Methoden mit setValue ()
Methoden mit patchValue ()
Die letzte Methode durchläuft alle Steuerelemente im Formular, sodass sie beim Aktualisieren eines einzelnen Steuerelements nicht bevorzugt wird
Sie können jede der Methoden im Ereignishandler verwenden
Sie können bei Bedarf mehrere Steuerelemente in der Formulargruppe mithilfe von aktualisieren
quelle
Sie könnten dies versuchen:
Weitere Informationen finden Sie im entsprechenden JS-Dokument zum zweiten Parameter der
updateValue
Methode: https://github.com/angular/angular/blob/master/modules/angular2/src/common/forms/model. ts # L269 .quelle
error TS2339: Property 'updateValue' does not exist on type 'AbstractControl'
. In dieser Komponente hat das Formular den TypControlGroup
. Vielleichtnew Control()
würde es funktionieren, wenn ich sie individuell damit erstelleNichts davon hat bei mir funktioniert. Ich musste es tun:
quelle
Wenn Sie nicht jedes Feld manuell einstellen möchten.
quelle
@ Filoches Angular 2 aktualisierte Lösung. Verwenden von
FormControl
(<Control>this.form.controls['dept']).updateValue(selected.id)
Alternativ können Sie die verwendete Lösung von @ AngularUniversity verwenden
patchValue
quelle
Ich weiß, dass die Antwort bereits gegeben ist, aber ich möchte eine kurze Antwort geben, wie der Wert eines Formulars aktualisiert wird, damit andere Neuankömmlinge eine klare Vorstellung davon bekommen.
Ihre Formularstruktur ist so perfekt, dass Sie sie als Beispiel verwenden können. In meiner Antwort werde ich es als Form bezeichnen.
Unser Formular ist also ein Objekt vom Typ FormGroup mit drei FormControl .
Wenn Sie also den Wert für eine Formulargruppeninstanz aktualisieren, die mehrere Steuerelemente enthält, möchten Sie möglicherweise nur Teile des Modells aktualisieren. patchValue () ist das, wonach Sie suchen.
Mal sehen, Beispiel. Wenn Sie patchValue () verwenden
Wenn Sie jedoch setValue () verwenden , müssen Sie das vollständige Modell aktualisieren, da es die Struktur der Formulargruppe strikt einhält . Also, wenn wir schreiben
Wir müssen alle Eigenschaften des Formulargruppenmodells übergeben. so was
aber ich benutze diesen Stil nicht häufig. Ich bevorzuge den folgenden Ansatz, um meinen Code sauberer und verständlicher zu halten.
Ich deklariere alle Steuerelemente als separate Variable und aktualisiere dieses spezifische Steuerelement mit setValue ().
Für das obige Formular werde ich so etwas tun.
Wenn Sie das Formularsteuerelement aktualisieren müssen, verwenden Sie einfach diese Eigenschaft, um es zu aktualisieren. In diesem Beispiel hat der Fragesteller versucht, die Abteilungsformularsteuerung zu aktualisieren, wenn der Benutzer ein Element aus der Dropdown-Liste auswählt.
Ich schlage vor, einen Blick auf die FormGroup-API zu werfen zu , um mehr über alle Eigenschaften und Methoden von FormGroup zu erfahren.
Zusätzlich : Informationen zu Getter finden Sie hier
quelle
Wenn Sie die Formularsteuerung verwenden, ist dies am einfachsten:
quelle
Tipp: Wenn Sie alle Eigenschaften des Formulars verwenden,
setValue
aber nicht angeben, wird folgende Fehlermeldung angezeigt:Must supply a value for form control with name: 'stateOrProvince'.
Sie könnten also versucht sein, es zu verwenden
patchValue
, aber dies kann gefährlich sein, wenn Sie versuchen, ein ganzes Formular zu aktualisieren. Ich habe eineaddress
, die möglicherweise nicht hatstateOrProvince
oder davonstateCd
abhängt, ob es sich um eine US-amerikanische oder eine weltweite handelt.Stattdessen können Sie wie folgt aktualisieren - wobei die Nullen als Standard verwendet werden:
quelle