Lo he leído en otras publicaciones, pero no pude resolverlo.
Tengo una matriz
$scope.items = [
{ID: '000001', Title: 'Chicago'},
{ID: '000002', Title: 'New York'},
{ID: '000003', Title: 'Washington'},
];
Quiero renderizarlo como:
<select>
<option value="000001">Chicago</option>
<option value="000002">New York</option>
<option value="000003">Washington</option>
</select>
Y también quiero seleccionar la opción con ID = 000002.
He leído select e intentado, pero no puedo entenderlo.
javascript
angularjs
html-select
ng-options
Andrej Kaurin
fuente
fuente
Respuestas:
Una cosa a tener en cuenta es que ngModel es necesario para que ngOptions funcione ... tenga en cuenta lo
ng-model="blah"
que dice "establecer $ scope.blah en el valor seleccionado".Prueba esto:
Aquí hay más de la documentación de AngularJS (si no la ha visto):
Para algunas aclaraciones sobre los valores de etiqueta de opción en AngularJS:
Cuando lo use
ng-options
, los valores de las etiquetas de opción escritas por ng-options siempre serán el índice del elemento de matriz con el que se relaciona la etiqueta de opción . Esto se debe a que AngularJS realmente le permite seleccionar objetos completos con controles de selección, y no solo tipos primitivos. Por ejemplo:Lo anterior le permitirá seleccionar un objeto completo
$scope.selectedItem
directamente. El punto es que, con AngularJS, no necesita preocuparse por lo que hay en su etiqueta de opción. Deje que AngularJS se encargue de eso; solo debe preocuparse por lo que hay en su modelo en su alcance.Aquí hay un plunker que demuestra el comportamiento anterior y muestra el HTML escrito
Tratar con la opción predeterminada:
Hay algunas cosas que no he mencionado anteriormente en relación con la opción predeterminada.
Seleccionando la primera opción y eliminando la opción vacía:
Puede hacer esto agregando un simple
ng-init
que establece el modelo (desdeng-model
) al primer elemento en los elementos en los que repiteng-options
:Nota: Esto podría volverse un poco loco si
foo
se inicializa correctamente a algo "falso". En ese caso, lo más probable es que desee manejar la inicialización defoo
su controlador.Personalizar la opción predeterminada:
Esto es un poco diferente; aquí todo lo que necesita hacer es agregar una etiqueta de opción como elemento secundario de su selección, con un atributo de valor vacío, luego personalizar su texto interno:
Nota: En este caso, la opción "vacía" permanecerá allí incluso después de seleccionar una opción diferente. Este no es el caso del comportamiento predeterminado de las selecciones en AngularJS.
Una opción predeterminada personalizada que se oculta después de realizar una selección:
Si desea que su opción predeterminada personalizada desaparezca después de seleccionar un valor, puede agregar un atributo ng-hide a su opción predeterminada:
fuente
<option value="?" selected="selected"></option>
)?ng-if="foo"
tener que usarng-if=!foo
para ocultar la opción vacía predeterminada cuando se selecciona otra opción. Además, la opción vacía predeterminada aparece siempre en la parte inferior de la lista combinada. ¿Cómo puedo ponerlo al comienzo de la lista combinada?Estoy aprendiendo AngularJS y también estaba luchando con la selección. Sé que esta pregunta ya está respondida, pero de todos modos quería compartir más código.
En mi prueba tengo dos cuadros de lista: marcas de automóviles y modelos de automóviles. La lista de modelos está deshabilitada hasta que se seleccione alguna marca. Si la selección en el cuadro de lista de marcas se restablece más tarde (se establece en 'Seleccionar marca'), el cuadro de lista de modelos se deshabilita nuevamente Y su selección también se restablece (a 'Seleccionar modelo'). Las marcas se recuperan como un recurso, mientras que los modelos solo están codificados.
Hace JSON:
services.js:
Archivo HTML:
controllers.js:
fuente
ng-model
debe apuntar a otra variable en su alcance, no relacionada conmake
. Vea el ejemplo en docs.angularjs.org/api/ng/directive/ngOptionsPor alguna razón, AngularJS me permite confundirme. Su documentación es bastante horrible sobre esto. Más buenos ejemplos de variaciones serían bienvenidos.
De todos modos, tengo una ligera variación en la respuesta de Ben Lesh.
Mis colecciones de datos se ven así:
Ahora
todavía resultó en el valor de las opciones para ser el índice (0, 1, 2, etc.).
Añadiendo Track By lo arregló para mí:
Creo que sucede más a menudo que desea agregar una matriz de objetos en una lista de selección, ¡así que recordaré este!
Tenga en cuenta que desde AngularJS 1.4 ya no puede usar ng-options, pero debe usarlo
ng-repeat
en su etiqueta de opción:fuente
option
?La pregunta ya está respondida (por cierto, una respuesta realmente buena y completa proporcionada por Ben), pero me gustaría agregar otro elemento para completar, que también puede ser muy útil.
En el ejemplo sugerido por Ben:
la siguientes ngOptions forma se ha utilizado:
select as label for value in array
.Etiqueta es una expresión, cuyo resultado será la etiqueta del
<option>
elemento. En ese caso, puede realizar ciertas concatenaciones de cadenas para tener etiquetas de opciones más complejas.Ejemplos:
ng-options="item.ID as item.Title + ' - ' + item.ID for item in items"
te da etiquetas comoTitle - ID
ng-options="item.ID as item.Title + ' (' + item.Title.length + ')' for item in items"
le da etiquetas comoTitle (X)
, dondeX
es la longitud de la cadena de título.También puede usar filtros, por ejemplo,
ng-options="item.ID as item.Title + ' (' + (item.Title | uppercase) + ')' for item in items"
le da etiquetas comoTitle (TITLE)
, donde el valor de Título de la propiedad Título y TÍTULO es el mismo valor pero convertido a mayúsculas.ng-options="item.ID as item.Title + ' (' + (item.SomeDate | date) + ')' for item in items"
le da etiquetas comoTitle (27 Sep 2015)
, si su modelo tiene una propiedadSomeDate
fuente
En CoffeeScript:
fuente
radix
paraparseInt
: http://davidwalsh.name/parseint-radixSi necesita un título personalizado para cada opción,
ng-options
no es aplicable. En lugar de usarng-repeat
con opciones:fuente
Espero que lo siguiente funcione para ti.
fuente
Puede ser útil Los enlaces no siempre funcionan.
Por ejemplo, completa el modelo de origen de la lista de opciones de un servicio REST. Se conocía un valor seleccionado antes de completar la lista, y se configuró. Después de ejecutar la solicitud REST con $ http, la opción de lista está lista.
Pero la opción seleccionada no está configurada. Por razones desconocidas, AngularJS en la ejecución de shadow $ digest no se une seleccionado como debería ser. Tengo que usar jQuery para configurar el seleccionado. Es importante! AngularJS, en la sombra, agrega el prefijo al valor del "valor" del atributo generado por las opciones ng-repeat. Para int es "número:".
fuente