J'ai un mat-select où les options sont tous les objets définis dans un tableau. J'essaie de définir la valeur par défaut sur l'une des options, mais elle est laissée sélectionnée lorsque la page s'affiche.
Mon fichier dactylographié contient:
public options2 = [
{"id": 1, "name": "a"},
{"id": 2, "name": "b"}
]
public selected2 = this.options2[1].id;
Mon fichier HTML contient:
<div>
<mat-select
[(value)]="selected2">
<mat-option
*ngFor="let option of options2"
value="{{ option.id }}">
{{ option.name }}
</mat-option>
</mat-select>
</div>
J'ai essayé de placer selected2
et value
dans mat-option
à la fois l'objet et son identifiant, et ont essayé d' utiliser à la fois [(value)]
et [(ngModel)]
dans le mat-select
, mais aucun ne fonctionne.
J'utilise la version matérielle 2.0.0-beta.10
angular
typescript
angular-material2
William Moore
la source
la source
compareWith
. C'est plus élégant.compareWith
, voir la réponse de badis ici stackoverflow.com/questions/47333171/…Réponses:
Utilisez une liaison pour la valeur de votre modèle.
devrait être
Et dans votre utilisation de valeur sélectionnée
ngModel
au lieu devalue
.devrait être
Code complet:
Par ailleurs, à partir de la version 2.0.0-beta.12, la sélection de matériaux accepte désormais un
mat-form-field
élément comme élément parent afin qu'il soit cohérent avec les autres contrôles d'entrée de matériaux. Remplacez l'div
élément par l'mat-form-field
élément après la mise à niveau.la source
mat-form-field
, ce n'est..."used to wrap several Angular Material components and apply common Text field styles"
donc pas la même chose. Autre que l'OP et aussi ma réponse ne fait aucune mentionFormControl
,FormGroup
ouFormControlName
.[compareWith]
directive est ce que nous avons utiliséUtilisez
compareWith
, Une fonction pour comparer les valeurs d'option avec les valeurs sélectionnées. voir ici: https://material.angular.io/components/select/api#MatSelectPour un objet de la structure suivante:
Définissez le balisage comme ceci:
Et définissez la fonction de comparaison comme ceci:
la source
J'utilise Angular 5 et des formulaires réactifs avec mat-select et je n'ai pas pu obtenir l'une des solutions ci-dessus pour afficher la valeur initiale.
J'ai dû ajouter [compareWith] pour gérer les différents types utilisés dans le composant mat-select. En interne, il semble que mat-select utilise un tableau pour contenir la valeur sélectionnée. Cela permettra probablement au même code de fonctionner avec plusieurs sélections si ce mode est activé.
Doc de contrôle de sélection angulaire
Voici ma solution:
Form Builder pour initialiser le contrôle de formulaire:
Ensuite, implémentez la fonction compareWith sur votre composant:
Ensuite, créez et exportez la fonction determineId (j'ai dû créer une fonction autonome pour que mat-select puisse l'utiliser):
Enfin, ajoutez l'attribut compareWith à votre sélection de tapis:
la source
Vous devez le lier comme
[value]
dans lemat-option
comme ci - dessous,DÉMO EN DIRECT
la source
Vous pouvez simplement implémenter votre propre fonction de comparaison
[compareWith]="compareItems"
Voir aussi le docu . Le code complet ressemblerait donc à:
et dans le fichier Typescript:
la source
i1
oui2
non.Comme déjà mentionné dans Angular 6, l'utilisation de ngModel sous des formes réactives est obsolète (et supprimée dans Angular 7), j'ai donc modifié le modèle et le composant comme suit.
Le gabarit:
Les parties principales du composant (
onChanges
et les autres détails sont omis):Remarque this.filter.setValue (this.selected) au -
ngOnInit
dessus.Cela semble fonctionner dans Angular 6.
la source
[compareWith]
was greatJe l'ai fait comme dans ces exemples. J'ai essayé de définir la valeur de la sélection de tapis sur la valeur de l'une des options de tapis. Mais a échoué.
Mon erreur a été de faire [(value)] = "someNumberVariable" à une variable de type numérique alors que celles de mat-options étaient des chaînes. Même s'ils avaient la même apparence dans le modèle, cette option ne serait pas sélectionnée.
Une fois que j'ai analysé le someNumberVariable en une chaîne, tout allait parfaitement bien.
Il semble donc que vous ayez besoin que les valeurs mat-select et mat-option soient non seulement le même nombre (si vous présentez des nombres), mais aussi qu'elles soient de type string.
la source
La solution pour moi était:
TS:
Utilisation de l'objet: {id: number, detalle: string}
la source
Essaye ça!
la source
Ma solution est peu compliquée et plus simple.
Je viens d'utiliser l' espace réservé . La couleur par défaut de l'espace réservé de matériau est
light gray
. Pour donner l'impression que l'option est sélectionnée, j'ai simplement manipulé le CSS comme suit:la source
La liaison ou la définition de la valeur par défaut ne fonctionne que si l' attribut value sur MatSelect est comparable à l' attribut value lié à MatOption . Si vous liez
caption
votre élément à l' attribut value de l' élément mat-option , vous devez également définir l'élément par défaut sur mat-select surcaption
de votre élément. Si vous liezId
votre élément à mat-option , vous devez également vous lierid
à mat-select , pas à un élément entier, à une légende ou à tout autre, seulement au même champ.Mais vous devez le faire avec la liaison []
la source
J'ai suivi très attentivement ce qui précède et je n'ai toujours pas pu sélectionner la valeur initiale.
La raison en était que bien que ma valeur liée ait été définie comme une chaîne dans le typographie, mon API backend renvoyait un nombre.
Javascript lâche typage a simplement changé le type à l'exécution (sans erreur), ce qui a empêché la sélection de la valeur initiale.
Composant
Modèle
La solution était de mettre à jour l'API pour renvoyer une valeur de chaîne.
la source
Un moyen très simple d'y parvenir consiste à utiliser a
formControl
avec une valeur par défaut, à l'intérieur de aFormGroup
(facultatif) par exemple. Voici un exemple utilisant un sélecteur d'unité pour une entrée de zone:ts
html
la source
Une comparaison entre un nombre et une chaîne est fausse , donc, transtypez la valeur sélectionnée en une chaîne dans ngOnInit et cela fonctionnera.
J'ai eu le même problème, j'ai rempli le mat-select avec une énumération, en utilisant
et j'avais la valeur enum que je voulais sélectionner ...
J'ai passé quelques heures à essayer de comprendre pourquoi cela ne fonctionnait pas. Et je l'ai fait juste après avoir rendu toutes les variables utilisées dans le mat-select, la collection de clés et la sélection ... si vous avez ["0", "1", "2"] et que vous voulez sélectionner 1 ( qui est un nombre) 1 == "1" est faux et à cause de cela rien n'est sélectionné.
donc, la solution consiste à convertir la valeur sélectionnée en une chaîne dans ngOnInit et cela fonctionnera.
la source
J'ai fait ça.
Normalement, vous pouvez le faire
[value]="option"
, à moins que vous n'obteniez vos options à partir d'une base de données ?? Je pense que soit le retard d'obtention des données les empêche de fonctionner, soit les objets obtenus sont différents d'une certaine manière même s'ils sont les mêmes ?? Curieusement, c'est probablement le plus récent, car j'ai également essayé[value]="option === selected ? selected : option"
et cela n'a pas fonctionné.la source
TS
HTML
la source
la source