Angular ajoute des options étranges dans l'élément select lors de la définition de la valeur du modèle

J'ai un élément select défini comme tel:

<select name="country_id" id="country_id" required="required" ng-model="newAddressForm.country_id">
    <option value="">Select Country</option>
    <option ng-repeat="country in countries" value="{{country.id}}">{{country.name}}</option>
</select>

Tout fonctionne bien quand je ne définis aucun type de valeur dans la directive qui contient cet élément select. Mais quand je fais quelque chose comme newAddressForm.country_id = 98, au lieu de sélectionner l'option avec la valeur 98, Angulaire injecte une nouvelle dans le haut de l'élément select, comme ceci:

<option value="? string:98 ?"></option>

Qu'est-ce qui donne? Quel genre de format est-ce et pourquoi? Notez que si je fais un console.log(newAddressForm.country_id) dans la directive, j'obtiens un "98" normal, c'est juste bizarre dans le code HTML généré.

Modifier: mise à jour de la Situation. est passé à l'aide de ng-select, mais le problème persiste.

L'élément bizarre n'apparaît plus, mais maintenant il y a un autre élément en haut, qui n'a qu'un point d'interrogation ? comme valeur, et aucune étiquette.

C'est, d'après ce que j'ai compris, L'option "none selected" D'Angular. Je ne comprends toujours pas pourquoi il ne sélectionnera pas l'option que je lui dis de sélectionner, cependant.

Faire newAddressForm.country_id = 98 ne donne toujours aucun résultat. Pourquoi est-ce que?

41
demandé sur georgeawg 2013-05-28 07:10:23

6 réponses

Angular ne définit pas la valeur d'un élément select sur les valeurs réelles de votre tableau et fait des choses internes pour gérer la liaison de portée. Voir le premier commentaire de Mark Rajcok sur ce lien:

Https://docs.angularjs.org/api/ng/directive/select#overview

Lorsque l'utilisateur sélectionne l'une des options, Angulaire utilise l'index (ou clé) pour rechercher la valeur dans le tableau (ou l'objet) - qui a recherché la valeur est ce que le modèle est défini. (Donc, le modèle n'est pas définie à l' valeur que vous voyez dans le HTML! Cela provoque beaucoup de confusion.)

Je ne suis pas tout à fait sûr d'utiliser un ng-repeat est la meilleure option.

16
répondu lucuma 2018-08-03 10:56:35

En utilisant la syntaxe suivante avec ng-options résolu ce problème pour moi:

<select name="country_id" id="country_id" required="required" ng-model="newAddressForm.country_id" ng-options="country.id as country.name for country in countries">
  <option value="">Select Country</option>
</select>
17
répondu jessedvrs 2014-07-15 08:39:57

Si vos valeurs sont des entiers, vous devez utiliser "" même si ce ne sont pas des chaînes, cette raison simple est exactement pourquoi vous obtenez une option avec un point d'interrogation en tant que valeur.

Vous ne devriez pas utiliser ceci:

{ value: 0, name: "Pendiente" },
{ value: 1, name: "Em andamento" },
{ value: 2, name: "Erro" },
{ value: 3, name: "Enviar email" },
{ value: 4, name: "Enviado" }

C'est la bonne façon:

{ value: "0", name: "Pendiente" },
{ value: "1", name: "Em andamento" },
{ value: "2", name: "Erro" },
{ value: "3", name: "Enviar email" },
{ value: "4", name: "Enviado" }

Si vous avez au moins un enregistrement qui n'utilise pas"", vous obtiendrez ceci ? la valeur d'option.

2
répondu Martin 2016-02-25 22:46:37

Je rencontrais ce même problème plus tôt ce soir, où j'ai vu une option select apparaître comme la première de ma liste même si Je ne l'ai pas explicitement créée. Je remplissais une liste d'options de sélection dans mon contrôleur et en utilisant la même syntaxe ng-options mentionnée ci-dessus par jessedvrs (sauf que j'insérais également l'option par défaut "sélectionner une option" dans le contrôleur plutôt que de la marquer dans le HTML comme il l'était).

Pour une raison quelconque, la liste de sélection afficherait toujours un option supplémentaire à l'indice zéro avec une valeur "?", mais quand j'ai changé comment j'ai rempli mon option par défaut dans le contrôleur, ce problème a disparu. Je remplissais les options de sélection en faisant un appel D'API, en les remplissant à l'intérieur d'une promesse. J'ai fait l'erreur de remplir également mon option "select an option" par défaut comme la première chose que j'ai faite dans cette promesse, mais quand je l'ai fait à la place en dehors de de la promesse (avant de faire l'appel API), les options select ont rempli la façon dont je les ai diminuées de.

Je pense que l'option jessedvrs est une solution au problème (définition de l'option par défaut dans le balisage HTML), mais si vous préférez remplir vos options en javascript à la place, je suggère de toujours définir l'option par défaut avant de faire des appels à une API ou des processus qui peuvent encore être en cours d'exécution pendant

1
répondu Developer Dave 2014-12-06 07:10:16

Lorsque vous affectez une valeur à un élément select, AngularJS recherche la valeur fournie dans l'attribut value des balises d'option de cet élément select. Mais le hic est, AngularJS fait une comparaison basée sur le type . Donc, si les valeurs dans les balises d'option sont des chaînes (ce qui est généralement le cas) et que la variable que vous liez en utilisant ng-model est un nombre, AngularJS ne parvient pas à trouver l'élément option correspondant et crée donc son propre élément comme ceci -

<option value="? integer:10 ?"></option>

La solution est, tandis que se lier, le convertir au type approprié.

Dans ce cas, la solution serait de lier un Entier

<select name="country_id" id="country_id" required="required" ng-model="parseInt(newAddressForm.country_id)">
<option value="">Select Country</option>
<option ng-repeat="country in countries" value="{{country.id}}">{{country.name}}</option>
</select>

Si les valeurs sont définies comme des chaînes, l'astuce serait d'utiliser

<select ... ng-model="newAddressForm.country_id.toString()" >
1
répondu Pratik Kapasi 2017-04-21 14:26:02

Tout en poussant des données sur la variable de portée, nous pouvons utiliser le code suivant

$scope.enquiryLocationRow.push({'location': EnqLocation.location, 'state_id': Number(EnqLocation.state_id), 'country_id': Number(EnqLocation.country_id)});

Il a résolu mon problème

0
répondu Manoj Atakare 2017-05-12 07:46:22