Voici ce qui semble déranger beaucoup de gens (dont moi).
Lorsque j'utilise la ng-options
directive dans AngularJS pour remplir les options d'une <select>
balise, je ne peux pas comprendre comment définir la valeur d'une option. La documentation à ce sujet n'est vraiment pas claire - du moins pour un niais comme moi.
Je peux facilement définir le texte d'une option comme ceci:
ng-options="select p.text for p in resultOptions"
Quand resultOptions
est par exemple:
[
{
"value": 1,
"text": "1st"
},
{
"value": 2,
"text": "2nd"
}
]
Cela devrait être (et est probablement) la chose la plus simple pour définir les valeurs des options, mais jusqu'à présent, je ne comprends pas.
javascript
angularjs
Jukka Puranen
la source
la source
Réponses:
Dans votre cas, il devrait être
Mise à jour
Avec les mises à jour sur AngularJS, il est désormais possible de définir la valeur réelle de l'
value
attribut d'select
élément avectrack by
expression.Comment se souvenir de ces trucs laids
À toutes les personnes qui ont du mal à se souvenir de cette forme de syntaxe: je suis d'accord que ce n'est pas la syntaxe la plus simple ou la plus belle. Cette syntaxe est une sorte de version étendue des compréhensions de liste de Python et sachant que cela m'aide à me souvenir de la syntaxe très facilement. C'est quelque chose comme ça:
Code Python:
Il s'agit en fait de la même syntaxe que la première répertoriée ci-dessus. Cependant,
<select>
nous devons généralement faire la différence entre la valeur réelle du code et le texte affiché (l'étiquette) dans un<select>
élément.Comme, nous avons besoin
person.id
dans le code, mais nous ne voulons pas montrerid
à l'utilisateur; nous voulons montrer son nom. De même, nous ne sommes pas intéressésperson.name
par le code. Il y a leas
mot - clé pour étiqueter les trucs. Alors ça devient comme ça:Ou, au lieu de
person.id
nous pourrions avoir besoin de l'person
instance / référence elle-même. Voir ci-dessous:Pour les objets JavaScript, la même méthode s'applique également. N'oubliez pas que les éléments de l'objet sont déconstruits par
(key, value)
paires.la source
Comment l'attribut value obtient sa valeur:
Donc, dans votre cas, cela devrait être:
la source
J'avais aussi ce problème. Je n'ai pas pu définir ma valeur dans ng-options. Chaque option générée a été définie sur 0, 1, ..., n.
Pour faire les choses correctement, j'ai fait quelque chose comme ça dans mes ng-options:
HTML:
J'utilise "track by" pour définir toutes mes valeurs avec
room.price
.(Cet exemple est nul: car s'il y avait plus d'un prix égal, le code échouerait. Assurez-vous donc d'avoir des valeurs différentes.)
JSON:
Je l'ai appris dans un article de blog Comment définir la valeur sélectionnée initiale d'un élément sélectionné à l'aide d'Angular.JS ng-options & track by .
Voir la vidéo. C'est une belle classe :)
la source
Si vous souhaitez modifier la valeur de vos
option
éléments car le formulaire sera finalement soumis au serveur, au lieu de le faire,Tu peux le faire:
La valeur attendue sera alors envoyée via le formulaire sous le nom correct.
la source
<input type="hidden" name="text" value="{{ text }}" />
, j'utiliseraisng-value
. Donc:<input type="hidden" name="text" ng-value="{{ text }}" />
.Pour envoyer une valeur personnalisée appelée
my_hero
au serveur à l'aide d'un formulaire normal, soumettez:JSON:
HTML:
Le serveur recevra soit
iron
ousuper
la valeur demy_hero
.Ceci est similaire à la réponse de @neemzy , mais en spécifiant des données distinctes pour l'
value
attribut.la source
Il semble que
ng-options
c'est compliqué (peut-être frustrant) à utiliser, mais en réalité nous avons un problème d'architecture.AngularJS sert de cadre MVC pour une application dynamique HTML + JavaScript. Bien que son composant (V) iew offre des «modèles» HTML, son objectif principal est de connecter les actions de l'utilisateur, via un contrôleur, aux modifications du modèle. Par conséquent, le niveau d'abstraction approprié, à partir duquel travailler dans AngularJS, est qu'un élément select définit une valeur dans le modèle à une valeur provenant d'une requête .
ng-options
fournit lefor
mot clé pour dicter le contenu de l'élément d'option, c'est- à- direp.text for p in resultOptions
.ng-options
Fournit donc leas
mot - clé pour spécifier quelle valeur est fournie au modèle comme dansk as v for (k,v) in objects
.La solution correcte à ce problème est alors de nature architecturale et implique la refactorisation de votre code HTML afin que le (M) odel effectue la communication avec le serveur lorsque cela est nécessaire. (au lieu que l'utilisateur soumette un formulaire).
Si une page HTML MVC ne nécessite pas une ingénierie excessive pour le problème en question: alors utilisez uniquement la partie de génération HTML du composant (V) iew d'AngularJS. Dans ce cas, suivez le même modèle que celui utilisé pour générer des éléments tels que
<li />
«sous<ul />
» et placez une répétition ng sur un élément option:Comme kludge , on peut toujours déplacer l'attribut name de l'élément select vers un élément d'entrée caché:
la source
"Note: ngOptions provides an iterator facility for the <option> element which should be used instead of ngRepeat when you want the select model to be bound to a non-string value. This is because an option element can only be bound to string values at present."
. Il n'est pas fait mention de performances, mais simplement que ngOptions est une alternative à ngRepeat.Tu peux le faire:
-- MISE À JOUR
Après quelques mises à jour, l' utilisateur frm.adiputra solution de est beaucoup mieux. Code:
la source
J'ai lutté avec ce problème pendant un certain temps aujourd'hui. J'ai lu la documentation AngularJS, ce poste et d'autres et quelques blogs vers lesquels ils mènent. Ils m'ont tous aidé à régler les moindres détails, mais au final, cela semble être un sujet déroutant. Principalement à cause des nombreuses nuances syntaxiques de
ng-options
.En fin de compte, pour moi, cela revient à moins, c'est plus.
Étant donné une étendue configurée comme suit:
C'est tout ce dont j'avais besoin pour obtenir le résultat souhaité:
Remarquez que je n'ai pas utilisé
track by
. L'utilisation detrack by
l'élément sélectionné retournerait toujours l'objet correspondant au FirmnessID, plutôt qu'au FirmnessID lui-même. Cela répond maintenant à mes critères, c'est-à-dire qu'il devrait renvoyer une valeur numérique plutôt que l'objet, et utiliserng-options
pour obtenir l'amélioration des performances qu'il fournit en ne créant pas de nouvelle étendue pour chaque option générée.En outre, je avais besoin la première ligne vide, donc j'ai simplement ajouté un
<option>
à la<select>
élément.Voici un Plunkr qui montre mon travail.
la source
Au lieu d'utiliser la nouvelle fonctionnalité "track by", vous pouvez simplement le faire avec un tableau si vous souhaitez que les valeurs soient les mêmes que le texte:
Notez la différence entre la syntaxe standard, qui fera des valeurs les clés de l'Object / Array, et donc 0,1,2 etc. pour un tableau:
k as v devient v as v .
J'ai découvert cela simplement sur la base du bon sens en regardant la syntaxe. (k, v) est l'instruction réelle qui divise le tableau / objet en paires de valeurs clés.
Dans l'instruction 'k as v', k sera la valeur et v sera l'option de texte affichée à l'utilisateur. Je pense que «suivre» est désordonné et exagéré.
la source
Selon moi, cela convenait le mieux à tous les scénarios:
où vous pouvez utiliser votre modèle pour lier les données. Vous obtiendrez la valeur telle que contiendra l'objet et la sélection par défaut en fonction de votre scénario.
la source
Voilà comment j'ai résolu cela. J'ai suivi la sélection par valeur et défini la propriété d'élément sélectionnée sur le modèle dans mon code JavaScript.
vm
est mon contrôleur et le pays du contrôleur récupéré du service est{CountryId =1, Code = 'USA', CountryName='United States of America'}
.Lorsque j'ai sélectionné un autre pays dans la liste déroulante de sélection et publié ma page avec "Enregistrer", j'ai obtenu le bon pays lié.
la source
La
ng-options
directive ne définit pas l'attribut value sur les<options>
éléments des tableaux:En utilisant des
limit.value as limit.text for limit in limits
moyens:Voir la question Stack Overflow AngularJS ng-options ne rendant pas les valeurs .
la source
la source
Vous pouvez utiliser ng-options pour obtenir une liaison de balise select à la valeur et afficher les membres
Lors de l'utilisation de cette source de données
vous pouvez utiliser ce qui suit pour lier votre balise de sélection à la valeur et au nom
ça marche super
la source
La réponse correcte à cette question a été fournie par l'utilisateur frm.adiputra , car actuellement cela semble être le seul moyen de contrôler explicitement l'attribut value des éléments d'option.
Cependant, je voulais juste souligner que "sélectionner" n'est pas un mot-clé dans ce contexte, mais juste un espace réservé pour une expression. Veuillez vous référer à la liste suivante, pour la définition de l'expression "select" ainsi que d'autres expressions qui peuvent être utilisées dans la directive ng-options.
L'utilisation de select telle qu'elle est décrite dans la question:
est essentiellement faux.
Sur la base de la liste des expressions, il semble que trackexpr puisse être utilisé pour spécifier la valeur, lorsque des options sont données dans un tableau d'objets, mais il a été utilisé avec un regroupement uniquement.
De la documentation d'AngularJS pour ng-options:
la source
La sélection d'un élément dans ng-options peut être un peu délicate selon la façon dont vous définissez la source de données.
Après avoir lutté avec eux pendant un certain temps, j'ai fini par faire un échantillon avec les sources de données les plus courantes que j'utilise. Vous pouvez le trouver ici:
http://plnkr.co/edit/fGq2PM?p=preview
Maintenant, pour faire fonctionner ng-options, voici quelques éléments à considérer:
key | label
. De nombreux exemples en ligne mettent les objets en tant que «clé», et si vous avez besoin d'informations de l'objet, définissez-les de cette façon, sinon utilisez la propriété spécifique dont vous avez besoin comme clé. (ID, CODE, etc. Comme dans l'exemple plckr)La façon de définir la valeur du contrôle déroulant / sélectionner dépend de # 3,
$scope.dropdownmodel = $scope.user.state;
Si vous définissez l'objet comme clé, vous devez parcourir les options, même l'attribution de l'objet ne définira pas l'élément comme sélectionné car ils auront des touches de hachage différentes, par exemple:
Vous pouvez remplacer savedValue pour la même propriété dans l'autre objet,
$scope.myObject.myProperty
.la source
Pour moi, la réponse de Bruno Gomes est la meilleure réponse.
Mais en réalité, vous n'avez pas à vous soucier de définir la propriété value de certaines options. AngularJS s'en chargera. Permettez-moi de vous expliquer en détail.
Veuillez considérer ce violon
Comme vous pouvez le voir dans la sortie du violon, quoi que vous choisissiez pour les options de sélection, c'est votre valeur personnalisée ou la valeur générée automatiquement 0, 1, 2 par AngularJS, cela n'a pas d'importance dans votre sortie, sauf si vous utilisez jQuery ou tout autre autre bibliothèque pour accéder à la valeur des options de la zone de liste déroulante sélectionnée et la manipuler en conséquence.
la source
Un an après la question, j'ai dû trouver une réponse à cette question car aucun d'eux n'a donné la réponse réelle, du moins pour moi.
Vous avez demandé comment sélectionner l'option, mais personne n'a dit que ces deux choses ne sont PAS les mêmes:
Si nous avons une option comme celle-ci:
Et nous essayons de définir une option par défaut comme celle-ci:
Cela ne fonctionnera PAS , mais si vous essayez de sélectionner l'option comme ceci:
Il TRAVAIL .
Même si ces deux objets ont les mêmes propriétés, AngularJS les considère comme DIFFÉRENTS car AngularJS compare par la référence .
Jetez un œil au violon http://jsfiddle.net/qWzTb/ .
la source
Veuillez utiliser la piste par propriété qui différencie les valeurs et les étiquettes dans la zone de sélection.
S'il vous plaît essayez
qui attribuera des étiquettes avec du texte et une valeur avec une valeur (à partir du tableau)
la source
Pour un objet:
la source
Il est toujours pénible pour les développeurs d'utiliser ng-options. Par exemple: obtenir une valeur sélectionnée vide / vide dans la balise de sélection. Surtout lorsqu'il s'agit d'objets JSON dans ng-options, cela devient plus fastidieux. Ici, j'ai fait quelques exercices à ce sujet.
Objectif: itérer le tableau d'objets JSON via l'option ng et définir le premier élément sélectionné.
Les données:
Dans la balise select, je devais afficher xyz et abc, où xyz doit être sélectionné sans trop d'effort.
HTML:
Par l'exemple de code ci-dessus, vous pourriez sortir de cette exagération.
Une autre référence :
la source
Le tutoriel ANGULAR.JS: NG-SELECT ET NG-OPTIONS m'a aidé à résoudre le problème:
la source
la source
Exécutez l'extrait de code et voyez les variations. Voici une note pour une compréhension rapide
Exemple 1 (sélection d'objet): -
ng-option="os.name for os in osList track by os.id"
. Voicitrack by os.id
important et devrait être là etos.id as
ne devrait pas avoir avantos.name
.ng-model="my_os"
doit être défini sur un objet avec la clé comme id commemy_os={id: 2}
.Exemple 2 (sélection de valeur): -
ng-option="os.id as os.name for os in osList"
. Icitrack by os.id
ne devrait PAS être là etos.id as
devrait être là avantos.name
.ng-model="my_os"
doit être définie sur une valeur telle quemy_os= 2
Un extrait de code de repos vous expliquera.
Afficher l'extrait de code
la source
Comme beaucoup l'ont dit auparavant, si j'ai des données comme ceci:
Je l'utiliserais comme:
Dans votre contrôleur, vous devez définir une valeur initiale pour vous débarrasser du premier élément vide:
la source
Voici comment je résous ce problème dans une application héritée:
En HTML:
En JavaScript:
...
Mon HTML affiche correctement la valeur de l'option.
la source
Directive ngOptions:
Case-1) étiquette pour la valeur dans le tableau:
Explication de la sortie (en supposant que le premier élément est sélectionné):
selectedItem = {nom: 'a', âge: 20} // [par défaut, l'élément sélectionné est égal à l' élément de valeur ]
selectedItem.age = 20
Cas-2) sélectionnez comme étiquette pour la valeur dans le tableau:
Explication de la sortie (en supposant que le premier élément est sélectionné): selectedItem = 20 // [la pièce sélectionnée est item.age ]
la source