formControlName
Wie kann ich bei einer Liste von Kontrollkästchen, die an dasselbe gebunden sind, ein Array von Kontrollkästchenwerten erstellen, die an das gebunden sind formControl
, anstatt einfach true
/false
?
Beispiel:
<form [formGroup]="checkboxGroup">
<input type="checkbox" id="checkbox-1" value="value-1" formControlName="myValues" />
<input type="checkbox" id="checkbox-2" value="value-2" formControlName="myValues" />
<input type="checkbox" id="checkbox-3" value="value-2" formControlName="myValues" />
</form>
checkboxGroup.controls['myValues'].value
Derzeit produziert:
true or false
Was ich möchte, dass es produziert:
['value-1', 'value-2', ...]
javascript
angular
checkbox
angular2-forms
Reagieren auf AngularVues
quelle
quelle
Antworten:
Mit Hilfe von Silentsod Answer habe ich eine Lösung geschrieben, um Werte anstelle von Zuständen in meinem formBuilder abzurufen.
Ich benutze eine Methode, um Werte im formArray hinzuzufügen oder zu entfernen. Es mag ein schlechter Ansatz sein, aber es funktioniert!
component.html
component.ts
Wenn ich mein Formular abschicke, sieht mein Modell beispielsweise so aus:
Es fehlt nur eines: eine Funktion zum Ausfüllen des formArray, wenn Ihr Modell bereits geprüfte Werte hat.
quelle
myChoices: new FormArray([], Validators.required)
Hier ist ein guter Ort, um die zu nutzen
FormArray
https://angular.io/docs/ts/latest/api/forms/index/FormArray-class.html zu verwendenZu Beginn werden wir unsere Steuerelemente entweder mit a
FormBuilder
oder mit a neu aufbauenFormArray
FormBuilder
neues FormArray
Das ist einfach genug, aber dann werden wir unsere Vorlage ändern und die Vorlagen-Engine damit umgehen lassen, wie wir an unsere Steuerelemente binden:
template.html
Hier iterieren wir über unsere Menge
FormControls
in unseremmyValues
FormArray
und für jedes Steuerelement binden wir[formControl]
an dieses Steuerelement anstatt an dasFormArray
Steuerelement und<div>{{checkboxGroup.controls['myValues'].value}}</div>
produzierentrue,false,true
während Ihre Vorlagensyntax ein wenig weniger manuell ist.Sie können dieses Beispiel verwenden: http://plnkr.co/edit/a9OdMAq2YIwQFo7gixbj?p=preview , um herumzustöbern
quelle
*ngFor="let control of checkboxGroup.controls['myValues'].controls ; let i=index""
In Angular 6 ist dies erheblich einfacher als in früheren Versionen, selbst wenn die Kontrollkästcheninformationen asynchron von einer API ausgefüllt werden.
Das erste, was zu erkennen ist, ist, dass
keyvalue
wir dank der Pipe von Angular 6 keine VerwendungFormArray
mehr benötigen und stattdessen a verschachteln könnenFormGroup
.Übergeben Sie zunächst FormBuilder an den Konstruktor
Dann initialisieren Sie unser Formular.
Wenn unsere Optionsfelddaten verfügbar sind, iterieren Sie sie und wir können sie direkt
FormGroup
als Namen in die verschachtelten Daten verschiebenFormControl
, ohne auf nummerindizierte Sucharrays angewiesen zu sein.Schließlich müssen wir in der Vorlage nur
keyvalue
die Kontrollkästchen durchlaufen: keine zusätzlichenlet index = i
, und die Kontrollkästchen werden automatisch in alphabetischer Reihenfolge angezeigt: viel sauberer.quelle
const checkboxes = ..
außerhalb des foreach platzieren;)Wenn Sie nach Kontrollkästchenwerten im JSON-Format suchen
Vollständiges Beispiel hier .
Ich entschuldige mich für die Verwendung von Ländernamen als Kontrollkästchenwerte anstelle der in der Frage angegebenen. Weitere Erklärung -
Erstellen Sie eine FormGroup für das Formular
Jedes Kontrollkästchen sei eine FormGroup, die aus einem Objekt erstellt wurde, dessen einzige Eigenschaft der Wert des Kontrollkästchens ist.
Das Array von FormGroups für die Kontrollkästchen wird verwendet, um das Steuerelement für die 'Länder' im übergeordneten Formular festzulegen.
Verwenden Sie in der Vorlage eine Pipe, um den Namen für das Kontrollkästchen-Steuerelement abzurufen
quelle
TL; DR
Dies fiel mir auch manchmal auf, so dass ich sowohl FormArray- als auch FormGroup-Ansätze ausprobierte.
Die Liste der Kontrollkästchen wurde die meiste Zeit auf dem Server ausgefüllt und ich habe sie über die API erhalten. Manchmal haben Sie jedoch ein statisches Kontrollkästchen mit Ihrem vordefinierten Wert. In jedem Anwendungsfall wird das entsprechende FormArray oder FormGroup verwendet.
Stellen Sie sich der Einfachheit halber vor, Sie hätten ein einfaches Produktformular zum Erstellen
Zuerst habe ich ein Formular mit nur dem Produktnamen formControl eingerichtet. Es ist ein Pflichtfeld.
Da die Kategorie dynamisch gerendert wird, muss ich diese Daten später in das Formular einfügen, nachdem die Daten fertig waren.
Es gibt zwei Ansätze, um die Kategorieliste aufzubauen.
1. Formulararray
Dies
buildCategoryFormGroup
gibt mir ein FormArray zurück. Es wird auch eine Liste ausgewählter Werte als Argument verwendet. Wenn Sie das Formular zum Bearbeiten von Daten wiederverwenden möchten, kann dies hilfreich sein. Für die Erstellung eines neuen Produktformulars ist es noch nicht anwendbar.Beachten Sie dies, wenn Sie versuchen, auf die formArray-Werte zuzugreifen. Es wird so aussehen
[false, true, true]
. Um eine Liste der ausgewählten IDs zu erhalten, war etwas mehr Arbeit erforderlich, um sie anhand der Liste zu überprüfen, jedoch basierend auf dem Array-Index. Klingt für mich nicht gut, aber es funktioniert.Deshalb bin ich auf
FormGroup
diese Sache gekommen2. Formulargruppe
Der Unterschied der formGroup besteht darin, dass die Formulardaten als Objekt gespeichert werden, für das ein Schlüssel und ein Formularsteuerelement erforderlich sind. Es ist daher eine gute Idee, den Schlüssel als Kategorie-ID festzulegen, damit wir ihn später abrufen können.
Der Wert der Formulargruppe sieht folgendermaßen aus:
Meistens möchten wir jedoch nur die Liste der Kategorie-IDs als erhalten
["category2", "category3"]
. Ich muss auch ein Get schreiben, um diese Daten zu nehmen. Ich mag diesen Ansatz besser im Vergleich zum formArray, weil ich den Wert tatsächlich aus dem Formular selbst übernehmen könnte.3. Benutzerdefinierter Validator zum Aktivieren mindestens eines Kontrollkästchens wurde aktiviert
Ich habe den Validator so eingestellt, dass mindestens das Kontrollkästchen X aktiviert ist. Standardmäßig wird nur ein Kontrollkästchen aktiviert.
quelle
Ich sehe hier keine Lösung, die die Frage vollständig mit reaktiven Formen in vollem Umfang beantwortet. Hier ist meine Lösung dafür.
Zusammenfassung
Hier ist der Kern der detaillierten Erklärung zusammen mit einem StackBlitz-Beispiel.
FormArray
für die Kontrollkästchen und initialisieren Sie das Formular.valueChanges
Observable ist perfekt, wenn Sie möchten, dass das Formular etwas anzeigt, aber etwas anderes in der Komponente speichert. Karte dastrue
/false
-Werte den gewünschten Werten zu.false
Werte zum Zeitpunkt der Übermittlung heraus.valueChanges
beobachtbar.StackBlitz Beispiel
Ausführliche Erklärung
Verwenden Sie FormArray, um das Formular zu definieren
Wie bereits in der Antwort als richtig markiert.
FormArray
ist der richtige Weg in solchen Fällen, in denen Sie die Daten lieber in einem Array abrufen möchten. Als erstes müssen Sie das Formular erstellen.Dadurch wird nur der Anfangswert aller Kontrollkästchen auf gesetzt
false
.Als nächstes müssen wir diese Formularvariablen in der Vorlage registrieren und über das
checkboxes
Array iterieren (NICHT dieFormArray
Daten, sondern die Kontrollkästchen), um sie in der Vorlage anzuzeigen.Nutzen Sie die beobachtbaren valueChanges
Hier ist der Teil, den ich in keiner hier gegebenen Antwort erwähnt sehe. In solchen Situationen, in denen wir diese Daten anzeigen, aber als etwas anderes speichern möchten, ist das
valueChanges
Observable sehr hilfreich. MitvalueChanges
können wir die Änderungen in dencheckboxes
und dannmap
dietrue
/false
Werte beobachten, die von denFormArray
zu den gewünschten Daten empfangen wurden . Beachten Sie, dass dies die Auswahl der Kontrollkästchen nicht ändert, da ein an das Kontrollkästchen übergebener Wahrheitswert es als aktiviert markiert und umgekehrt.Dies ordnet die
FormArray
Werte im Wesentlichen dem ursprünglichencheckboxes
Array zu und gibt dasvalue
zurück, falls das Kontrollkästchen als markiert isttrue
, andernfalls wird es zurückgegebenfalse
. DiesemitEvent: false
ist hier wichtig, da das Setzen desFormArray
Werts ohne ihn dazu führt, dassvalueChanges
ein Ereignis ausgegeben wird, das eine Endlosschleife erzeugt. Mit der EinstellungemitEvent
auf stellenfalse
wir sicher, dass dasvalueChanges
Observable nicht emittiert, wenn wir den Wert hier einstellen.Filtern Sie die falschen Werte heraus
Wir können die
false
Werte in der nicht direkt filtern,FormArray
da dies die Vorlage durcheinander bringt, da sie an die Kontrollkästchen gebunden sind. Die bestmögliche Lösung besteht also darin, diefalse
Werte während der Übermittlung herauszufiltern . Verwenden Sie dazu den Spread-Operator.Dies filtert im Grunde die falschen Werte aus dem heraus
checkboxes
.Abbestellen von valueChanges
Vergessen Sie nicht, sich abzumelden
valueChanges
Hinweis: Es gibt einen speziellen Fall , in dem ein Wert nicht auf den eingestellt wird ,
FormArray
invalueChanges
, dh wenn das Kontrollkästchen Wert auf die Zahl gesetzt0
. Dadurch sieht es so aus, als ob das Kontrollkästchen nicht aktiviert werden kann, da durch Aktivieren des Kontrollkästchens die OptionFormControl
als Zahl0
(ein falscher Wert) festgelegt wird und das Kontrollkästchen daher deaktiviert bleibt. Es wäre vorzuziehen, die Zahl nicht0
als Wert zu verwenden, aber wenn dies erforderlich ist, müssen Sie bedingt0
auf einen wahrheitsgemäßen Wert setzen, z. B. Zeichenfolge'0'
oder einfach nur,true
und ihn dann beim Senden wieder in die Zahl konvertieren0
.StackBlitz Beispiel
Der StackBlitz verfügt auch über Code, wenn Sie Standardwerte an die Kontrollkästchen übergeben möchten, damit diese in der Benutzeroberfläche als aktiviert markiert werden.
quelle
Erstellen Sie ein Ereignis, wenn Sie darauf klicken, und ändern Sie den Wert von true manuell in den Namen des Kontrollkästchens. Dann wird der Name oder true gleich ausgewertet, und Sie können alle Werte anstelle einer Liste von true / false abrufen. Ex:
component.html
component.ts
Dadurch wird das Ereignis abgefangen, nachdem es von Angular Forms bereits in true oder false geändert wurde. Wenn es true ist, ändere ich den Namen in den Namen des Kontrollkästchens, das bei Bedarf auch als true ausgewertet wird, wenn es auf true / false as überprüft wird Gut.
quelle
Wenn Sie ein reaktives Angular-Formular verwenden möchten ( https://angular.io/guide/reactive-forms) ).
Sie können ein Formularsteuerelement verwenden, um den ausgegebenen Wert der Gruppe von Kontrollkästchen zu verwalten.
Komponente
html
checklistState
Verwaltet das Modell / den Status der Checklisteneingaben. Mit diesem Modell können Sie den aktuellen Status einem beliebigen Wertformat zuordnen.
Modell:
checklist
FormularsteuerungDieses Steuerelement speichert den Wert, den Sie speichern möchten, z
Wertausgabe:
"value_1,value_2"
Siehe Demo unter https://stackblitz.com/edit/angular-multi-checklist
quelle
Meine Lösung - gelöst für Angular 5 mit Materialansicht
Die Verbindung erfolgt über die
Auf diese Weise kann es für mehrere Kontrollkästchen-Arrays in einem Formular funktionieren. Legen Sie einfach den Namen des Steuerelement-Arrays fest, das jedes Mal eine Verbindung herstellen soll.
Am Ende müssen Sie das Formular mit einer Reihe von IDs der Originaldatensätze speichern, die gespeichert / aktualisiert werden sollen.
quelle
SCHABLONENTEIL: -
CONTROLLER-TEIL: -
quelle
Addiere meine 5 Cent) Mein Fragenmodell
template.html
component.ts
quelle
Verwandte Antwort auf @ nash11: So würden Sie ein Array von Kontrollkästchenwerten erstellen
UND
Haben Sie ein Kontrollkästchen, das auch Alle Kontrollkästchen auswählt:
https://stackblitz.com/edit/angular-checkbox-custom-value-with-selectall
quelle