Étant donné une liste de cases à cocher liées à la même chose formControlName
, comment puis-je produire un tableau de valeurs de case à cocher liées au formControl
, plutôt que simplement true
/ false
?
Exemple:
<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
produit actuellement:
true or false
Ce que je veux qu'il produise:
['value-1', 'value-2', ...]
javascript
angular
checkbox
angular2-forms
RéagirToAngularVues
la source
la source
Réponses:
Avec l'aide de silentsod answer, j'ai écrit une solution pour obtenir des valeurs au lieu d'états dans mon formBuilder.
J'utilise une méthode pour ajouter ou supprimer des valeurs dans le formArray. C'est peut-être une mauvaise approche, mais ça marche!
component.html
component.ts
Lorsque je soumets mon formulaire, par exemple mon modèle ressemble à:
Une seule chose manque, une fonction pour remplir le formArray si votre modèle a déjà des valeurs vérifiées.
la source
myChoices: new FormArray([], Validators.required)
Voici un bon endroit pour utiliser
FormArray
https://angular.io/docs/ts/latest/api/forms/index/FormArray-class.htmlPour commencer, nous allons construire notre gamme de contrôles avec ou avec un
FormBuilder
nouveauFormArray
FormBuilder
nouveau FormArray
Assez facile à faire, mais nous allons ensuite changer notre modèle et laisser le moteur de création de modèles gérer la façon dont nous nous lions à nos contrôles:
template.html
Ici, nous itérons sur notre ensemble de
FormControls
dans notremyValues
FormArray
et pour chaque contrôle, nous nous lions[formControl]
à ce contrôle plutôt qu'auFormArray
contrôle et<div>{{checkboxGroup.controls['myValues'].value}}</div>
produittrue,false,true
tout en rendant la syntaxe de votre modèle un peu moins manuelle.Vous pouvez utiliser cet exemple: http://plnkr.co/edit/a9OdMAq2YIwQFo7gixbj?p=preview pour fouiller
la source
*ngFor="let control of checkboxGroup.controls['myValues'].controls ; let i=index""
Il est beaucoup plus facile de le faire dans Angular 6 que dans les versions précédentes, même lorsque les informations de case à cocher sont remplies de manière asynchrone à partir d'une API.
La première chose à réaliser est que grâce au
keyvalue
tube d' Angular 6, nous n'avons plus besoin d'utiliserFormArray
, et pouvons à la place imbriquer unFormGroup
.Tout d'abord, passez FormBuilder dans le constructeur
Ensuite, initialisez notre formulaire.
Lorsque nos données d'options de case à cocher sont disponibles, itérez-les et nous pouvons les pousser directement dans l'imbriqué en
FormGroup
tant que nomméFormControl
, sans avoir à compter sur des tableaux de recherche indexés par nombre.Enfin, dans le modèle, nous avons juste besoin d'itérer les
keyvalue
cases à cocher: pas de supplémentlet index = i
, et les cases à cocher seront automatiquement dans l'ordre alphabétique: beaucoup plus propre.la source
const checkboxes = ..
extérieur du foreach;)Si vous recherchez des valeurs de case à cocher au format JSON
Exemple complet ici .
Je m'excuse d'utiliser les noms de pays comme valeurs de case à cocher au lieu de ceux de la question. Explication supplémentaire -
Créer un FormGroup pour le formulaire
Laissez chaque case à cocher être un FormGroup construit à partir d'un objet dont la seule propriété est la valeur de la case à cocher.
Le tableau de FormGroups pour les cases à cocher est utilisé pour définir le contrôle pour les «pays» dans le formulaire parent.
Dans le modèle, utilisez un tube pour obtenir le nom du contrôle de case à cocher
la source
TL; DR
Cela m'a également frappé parfois, alors j'ai essayé les approches FormArray et FormGroup.
La plupart du temps, la liste des cases à cocher était remplie sur le serveur et je l'ai reçue via l'API. Mais parfois, vous aurez un ensemble statique de cases à cocher avec votre valeur prédéfinie. Avec chaque cas d'utilisation, le FormArray ou FormGroup correspondant sera utilisé.
Par souci de simplicité, imaginez que vous disposez d'un formulaire de création de produit simple avec
Tout d'abord, j'ai mis en place un formulaire avec uniquement le nom de produit formControl. C'est un champ obligatoire.
Étant donné que la catégorie est rendue dynamiquement, je devrai ajouter ces données dans le formulaire plus tard, une fois les données prêtes.
Il existe deux approches pour constituer la liste des catégories.
1. Form Array
Cela
buildCategoryFormGroup
me renverra un FormArray. Il prend également une liste de valeurs sélectionnées comme argument, donc si vous souhaitez réutiliser le formulaire pour modifier les données, cela peut être utile. Dans le but de créer un nouveau formulaire de produit, il n'est pas encore applicable.A noté que lorsque vous essayez d'accéder aux valeurs formArray. Cela ressemblera à
[false, true, true]
. Pour obtenir une liste des identifiants sélectionnés, il a fallu un peu plus de travail pour vérifier dans la liste, mais en fonction de l'index du tableau. Cela ne me semble pas bon mais ça marche.C'est pourquoi je suis venu utiliser
FormGroup
pour cette question2. Groupe de formulaires
La différence du formGroup est qu'il stockera les données du formulaire en tant qu'objet, ce qui nécessitait une clé et un contrôle de formulaire. C'est donc la bonne idée de définir la clé comme categoryId, puis nous pourrons la récupérer plus tard.
La valeur du groupe de formulaires ressemblera à ceci:
Mais le plus souvent, nous voulons obtenir uniquement la liste des ID de catégorie
["category2", "category3"]
. Je dois aussi écrire un get pour prendre ces données. J'aime mieux cette approche par rapport à formArray, car je pourrais en fait prendre la valeur du formulaire lui-même.3. Un validateur personnalisé pour cocher au moins une case a été coché
J'ai fait en sorte que le validateur vérifie qu'au moins X case à cocher était cochée, par défaut, il ne vérifiera qu'une seule case.
la source
Je ne vois pas de solution ici qui réponde complètement à la question en utilisant des formes réactives dans toute son étendue, alors voici ma solution pour la même chose.
Résumé
Voici l'essentiel de l'explication détaillée avec un exemple StackBlitz.
FormArray
pour les cases à cocher et initialisez le formulaire.valueChanges
observable est parfait lorsque vous voulez que le formulaire affiche quelque chose mais stocke autre chose dans le composant. Mappez ici les valeurstrue
/ auxfalse
valeurs souhaitées.false
valeurs au moment de la soumission.valueChanges
observable.Exemple de StackBlitz
Explication détaillée
Utilisez FormArray pour définir le formulaire
Comme déjà mentionné dans la réponse marquée comme correcte.
FormArray
est la voie à suivre dans les cas où vous préférez obtenir les données dans un tableau. La première chose à faire est donc de créer le formulaire.Cela définira simplement la valeur initiale de toutes les cases à cocher
false
.Ensuite, nous devons enregistrer ces variables de formulaire dans le modèle et parcourir le
checkboxes
tableau (PAS lesFormArray
données mais les cases à cocher) pour les afficher dans le modèle.Utiliser l'observable valueChanges
Voici la partie que je ne vois pas mentionnée dans aucune réponse donnée ici. Dans des situations comme celle-ci, où nous aimerions afficher lesdites données mais les stocker comme autre chose, l'
valueChanges
observable est très utile. En utilisantvalueChanges
, nous pouvons observer les changements danscheckboxes
, puismap
les valeurstrue
/false
reçues de laFormArray
aux données souhaitées. Notez que cela ne modifiera pas la sélection des cases à cocher car toute valeur de vérité passée à la case à cocher la marquera comme cochée et vice-versa.Cela mappe essentiellement les
FormArray
valeurs sur lecheckboxes
tableau d' origine et renvoie levalue
dans le cas où la case à cocher est cochéetrue
, sinon elle retournefalse
. LeemitEvent: false
est important ici car la définition de laFormArray
valeur sans elle entraînera l'émissionvalueChanges
d'un événement créant une boucle sans fin. En définissantemitEvent
surfalse
, nous nous assurons que l'valueChanges
observable n'émet pas lorsque nous définissons la valeur ici.Filtrer les fausses valeurs
Nous ne pouvons pas filtrer directement les
false
valeurs dans leFormArray
car cela gâcherait le modèle car elles sont liées aux cases à cocher. La meilleure solution possible est donc de filtrer lesfalse
valeurs lors de la soumission. Utilisez l'opérateur de diffusion pour ce faire.Cela filtre essentiellement les fausses valeurs du fichier
checkboxes
.Se désabonner de valueChanges
Enfin, n'oubliez pas de vous désabonner de
valueChanges
Remarque: il existe un cas particulier où une valeur ne peut pas être définie sur
FormArray
invalueChanges
, c'est-à-dire si la valeur de la case à cocher est définie sur le nombre0
. Cela donnera l'impression que la case à cocher ne peut pas être cochée car la sélection de la case à cocher définira leFormControl
comme numéro0
(une valeur erronée) et la gardera donc décochée. Il serait préférable de ne pas utiliser le nombre0
comme valeur, mais si cela est nécessaire, vous devez conditionnellement définir0
une valeur de vérité, par exemple une chaîne'0'
ou simplement,true
puis lors de la soumission, le reconvertir en nombre0
.Exemple de StackBlitz
Le StackBlitz a également un code lorsque vous souhaitez transmettre des valeurs par défaut aux cases à cocher afin qu'elles soient marquées comme cochées dans l'interface utilisateur.
la source
Créez un événement lorsque vous cliquez dessus, puis remplacez manuellement la valeur de true par le nom de ce que la case à cocher représente, puis le nom ou true évaluera la même chose et vous pourrez obtenir toutes les valeurs au lieu d'une liste de true / false. Ex:
component.html
component.ts
Cela intercepte l'événement après qu'il a déjà été changé en vrai ou faux par Angular Forms, si c'est vrai, je change le nom en nom de ce que la case à cocher représente, qui si nécessaire évaluera également à vrai si elle est vérifiée pour vrai / faux comme bien.
la source
Si vous souhaitez utiliser un formulaire réactif angulaire ( https://angular.io/guide/reactive-forms ).
Vous pouvez utiliser un contrôle de formulaire pour gérer la valeur sortie du groupe de cases à cocher.
composant
html
checklistState
Gère le modèle / l'état des entrées de la liste de contrôle. Ce modèle vous permet de mapper l'état actuel sur le format de valeur dont vous avez besoin.
Modèle:
checklist
Contrôle de formulaireCe contrôle stocke la valeur que vous souhaitez enregistrer comme par exemple
sortie de valeur:
"value_1,value_2"
Voir la démo sur https://stackblitz.com/edit/angular-multi-checklist
la source
Ma solution - résolu le problème pour Angular 5 avec Material View
La connexion se fait via le
De cette façon, il peut fonctionner pour plusieurs tableaux de cases à cocher dans un seul formulaire. Définissez simplement le nom du tableau de contrôles à connecter à chaque fois.
À la fin, vous enregistrez le formulaire avec un tableau d'ID d'enregistrement d'origine à enregistrer / mettre à jour.
la source
PARTIE DU MODÈLE: -
PARTIE CONTRÔLEUR: -
la source
Ajouter mes 5 cents) Mon modèle de question
template.html
component.ts
la source
Réponse associée à @ nash11, voici comment vous produiriez un tableau de valeurs de case à cocher
ET
avoir une case à cocher qui sélectionne également toutes les cases à cocher:
https://stackblitz.com/edit/angular-checkbox-custom-value-with-selectall
la source