J'ai lu à ce sujet dans d'autres articles, mais je n'ai pas pu le comprendre.
J'ai un tableau,
$scope.items = [
{ID: '000001', Title: 'Chicago'},
{ID: '000002', Title: 'New York'},
{ID: '000003', Title: 'Washington'},
];
Je veux le rendre comme:
<select>
<option value="000001">Chicago</option>
<option value="000002">New York</option>
<option value="000003">Washington</option>
</select>
Et aussi je veux sélectionner l'option avec ID = 000002.
J'ai lu select et essayé, mais je ne peux pas le comprendre.
javascript
angularjs
html-select
ng-options
Andrej Kaurin
la source
la source
Réponses:
Une chose à noter est que ngModel est nécessaire pour que ngOptions fonctionne ... notez le
ng-model="blah"
qui dit "définissez $ scope.blah sur la valeur sélectionnée".Essaye ça:
Voici plus de la documentation d'AngularJS (si vous ne l'avez pas vu):
Pour des éclaircissements sur les valeurs des balises d'option dans AngularJS:
Lorsque vous utilisez
ng-options
, les valeurs des balises d'option écrites par ng-options seront toujours l'index de l'élément de tableau auquel la balise d'option se rapporte . En effet, AngularJS vous permet en fait de sélectionner des objets entiers avec des contrôles de sélection, et pas seulement des types primitifs. Par exemple:Ce qui précède vous permettra de sélectionner
$scope.selectedItem
directement un objet entier . Le fait est qu'avec AngularJS, vous n'avez pas à vous soucier du contenu de votre balise d'option. Laissez AngularJS gérer cela; vous ne devez vous soucier que de ce qui se trouve dans votre modèle dans votre champ d'application.Voici un plongeur démontrant le comportement ci-dessus et montrant le code HTML écrit
Gérer l'option par défaut:
Il y a quelques choses que je n'ai pas mentionnées ci-dessus concernant l'option par défaut.
Sélection de la première option et suppression de l'option vide:
Vous pouvez le faire en ajoutant un simple
ng-init
qui définit le modèle (deng-model
) au premier élément dans les éléments dans lesquels vous répétezng-options
:Remarque: Cela pourrait devenir un peu fou s'il
foo
se trouve qu'il est correctement initialisé à quelque chose de "faux". Dans ce cas, vous voudrezfoo
probablement gérer l'initialisation de votre contrôleur.Personnalisation de l'option par défaut:
C'est un peu différent; ici, tout ce que vous devez faire est d'ajouter une balise d'option en tant qu'enfant de votre sélection, avec un attribut de valeur vide, puis de personnaliser son texte intérieur:
Remarque: Dans ce cas, l'option "vide" restera là même après avoir sélectionné une option différente. Ce n'est pas le cas pour le comportement par défaut des sélections sous AngularJS.
Une option par défaut personnalisée qui se cache après une sélection:
Si vous vouliez que votre option par défaut personnalisée disparaisse après avoir sélectionné une valeur, vous pouvez ajouter un attribut ng-hide à votre option par défaut:
la source
<option value="?" selected="selected"></option>
)?ng-if="foo"
j'ai dû utiliserng-if=!foo
pour masquer l'option vide par défaut lorsqu'une autre option est sélectionnée. De plus, l'option vide par défaut apparaît toujours en bas de la liste combinée. Comment puis-je le mettre au début de la liste combinée?J'apprends AngularJS et je me débattais aussi avec la sélection. Je sais que cette question a déjà reçu une réponse, mais je voulais néanmoins partager un peu plus de code.
Dans mon test, j'ai deux zones de liste: les marques de voitures et les modèles de voitures. La liste des modèles est désactivée jusqu'à ce qu'une marque soit sélectionnée. Si la sélection dans la liste de marques est ultérieurement réinitialisée (définie sur «Sélectionner la marque»), la liste de modèles est à nouveau désactivée ET sa sélection est également réinitialisée (sur «Sélectionner le modèle»). Les marques sont récupérées en tant que ressource tandis que les modèles sont simplement codés en dur.
Rend JSON:
services.js:
Fichier HTML:
controllers.js:
la source
ng-model
devrait pointer vers une autre variable sur votre portée, sans rapport avecmake
. Voir l'exemple dans docs.angularjs.org/api/ng/directive/ngOptionsPour une raison quelconque, AngularJS permet de m'embrouiller. Leur documentation est assez horrible à ce sujet. De plus bons exemples de variations seraient les bienvenus.
Quoi qu'il en soit, j'ai une légère variation sur la réponse de Ben Lesh.
Mes collections de données ressemblent à ceci:
Maintenant
la valeur des options était toujours l'index (0, 1, 2, etc.).
Ajouter un morceau en le corrigeant pour moi:
Je pense qu'il arrive plus souvent que vous souhaitiez ajouter un tableau d'objets dans une liste de sélection, donc je vais me souvenir de celui-ci!
Sachez que depuis AngularJS 1.4, vous ne pouvez plus utiliser ng-options, mais vous devez utiliser
ng-repeat
sur votre balise option:la source
option
?La question est déjà répondue (BTW, réponse vraiment bonne et complète fournie par Ben), mais je voudrais ajouter un autre élément pour être complet, qui peut également être très pratique.
Dans l'exemple suggéré par Ben:
ce qui suit ngOptions forme a été utilisée:
select as label for value in array
.Label est une expression dont le résultat sera le label de l'
<option>
élément. Dans ce cas, vous pouvez effectuer certaines concaténations de chaînes, afin d'avoir des étiquettes d'options plus complexes.Exemples:
ng-options="item.ID as item.Title + ' - ' + item.ID for item in items"
vous donne des étiquettes commeTitle - ID
ng-options="item.ID as item.Title + ' (' + item.Title.length + ')' for item in items"
vous donne des étiquettes commeTitle (X)
, oùX
est la longueur de la chaîne de titre.Vous pouvez également utiliser des filtres, par exemple,
ng-options="item.ID as item.Title + ' (' + (item.Title | uppercase) + ')' for item in items"
vous donne des étiquettes commeTitle (TITLE)
, où la valeur Title de la propriété Title et TITLE est la même valeur mais convertie en caractères majuscules.ng-options="item.ID as item.Title + ' (' + (item.SomeDate | date) + ')' for item in items"
vous donne des étiquettes commeTitle (27 Sep 2015)
, si votre modèle a une propriétéSomeDate
la source
Dans CoffeeScript:
la source
radix
pourparseInt
: http://davidwalsh.name/parseint-radixSi vous avez besoin d'un titre personnalisé pour chaque option,
ng-options
n'est pas applicable. Utilisez plutôtng-repeat
avec des options:la source
J'espère que ce qui suit fonctionnera pour vous.
la source
Cela peut être utile. Les liaisons ne fonctionnent pas toujours.
Par exemple, vous remplissez le modèle source de liste d'options à partir d'un service REST. Une valeur sélectionnée était connue avant de remplir la liste et elle a été définie. Après avoir exécuté la requête REST avec $ http, l'option de liste est terminée.
Mais l'option sélectionnée n'est pas définie. Pour des raisons inconnues, AngularJS dans l'exécution de shadow $ digest ne lie pas la sélection comme il se doit. Je dois utiliser jQuery pour définir la sélection. C'est important! AngularJS, dans l'ombre, ajoute le préfixe à la valeur de la "valeur" attr pour les options générées par ng-repeat. Pour int c'est "nombre:".
la source