Esto es lo que parece estar molestando a mucha gente (incluido yo).
Cuando uso la ng-options
directiva en AngularJS para completar las opciones de una <select>
etiqueta, no puedo entender cómo establecer el valor de una opción. La documentación para esto realmente no está clara, al menos para un tonto como yo.
Puedo configurar el texto para una opción fácilmente así:
ng-options="select p.text for p in resultOptions"
Cuando resultOptions
es por ejemplo:
[
{
"value": 1,
"text": "1st"
},
{
"value": 2,
"text": "2nd"
}
]
Debería ser (y probablemente lo sea) lo más simple para establecer los valores de las opciones, pero hasta ahora no lo entiendo.
javascript
angularjs
Jukka Puranen
fuente
fuente
Respuestas:
En su caso, debería ser
Actualizar
Con las actualizaciones en AngularJS, ahora es posible establecer el valor real para el
value
atributo delselect
elemento contrack by
expresión.Cómo recordar estas cosas feas
Para todas las personas que están teniendo dificultades para recordar esta forma de sintaxis: Estoy de acuerdo en que esta no es la sintaxis más fácil o hermosa. Esta sintaxis es una especie de versión extendida de las comprensiones de la lista de Python y su conocimiento me ayuda a recordar la sintaxis muy fácilmente. Es algo como esto:
Código de Python:
Esta es en realidad la misma sintaxis que la primera listada anteriormente. Sin embargo,
<select>
generalmente necesitamos diferenciar entre el valor real en el código y el texto que se muestra (la etiqueta) en un<select>
elemento.Como, necesitamos
person.id
en el código, pero no queremos mostrarloid
al usuario; Queremos mostrar su nombre. Del mismo modo, no estamos interesadosperson.name
en el código. Llega laas
palabra clave para etiquetar cosas. Entonces se vuelve así:O, en lugar de
person.id
eso, podríamos necesitar laperson
instancia / referencia en sí. Vea abajo:Para los objetos JavaScript, también se aplica el mismo método. Solo recuerda que los elementos del objeto se deconstruyen con
(key, value)
pares.fuente
Cómo los atributos de valor obtienen su valor:
Entonces, en su caso, debería ser:
fuente
También tuve este problema. No pude establecer mi valor en ng-options. Cada opción que se generó se configuró con 0, 1, ..., n.
Para hacerlo bien, hice algo como esto en mis ng-options:
HTML:
Uso "track by" para establecer todos mis valores con
room.price
.(Este ejemplo apesta: porque si hubiera más de un precio igual, el código fallaría. ASEGÚRESE de tener valores diferentes).
JSON
Lo aprendí de la publicación del blog Cómo establecer el valor inicial seleccionado de un elemento seleccionado usando Angular.JS ng-options & track by .
Ver el vídeo. Es una buena clase :)
fuente
Si quieres cambiar el valor de tu
option
elementos porque el formulario finalmente se enviará al servidor, en lugar de hacerlo,Puedes hacerlo:
El valor esperado se enviará a través del formulario con el nombre correcto.
fuente
<input type="hidden" name="text" value="{{ text }}" />
, usaríang-value
. Por lo tanto:<input type="hidden" name="text" ng-value="{{ text }}" />
.Para enviar un valor personalizado llamado
my_hero
al servidor utilizando un formulario normal, envíe:JSON
HTML:
El servidor recibirá uno
iron
osuper
el valor demy_hero
.Esto es similar a la respuesta de @neemzy , pero especifica datos separados para el
value
atributo.fuente
Parece que
ng-options
es complicado (posiblemente frustrante) de usar, pero en realidad tenemos un problema de arquitectura.AngularJS sirve como un marco MVC para una aplicación dinámica de HTML + JavaScript. Si bien su componente (V) iew ofrece "plantillas" HTML, su propósito principal es conectar las acciones del usuario, a través de un controlador, a los cambios en el modelo. Por lo tanto, el nivel apropiado de abstracción, desde el cual trabajar en AngularJS, es que un elemento de selección establece un valor en el modelo en un valor de una consulta .
ng-options
proporciona lafor
palabra clave para dictar cuál debería ser el contenido del elemento de opción, es decirp.text for p in resultOptions
.ng-options
proporciona laas
palabra clave para especificar qué valor se proporciona al modelo como enk as v for (k,v) in objects
.La solución correcta, este problema es de naturaleza arquitectónica e implica refactorizar su HTML para que el (M) odel realice la comunicación del servidor cuando sea necesario (en lugar de que el usuario envíe un formulario).
Si una página HTML de MVC no es necesaria una ingeniería excesiva para el problema en cuestión: utilice solo la parte de generación de HTML del componente iew de AngularJS (V). En este caso, siga el mismo patrón que se utiliza para generar elementos como
<li />
's debajo de<ul />
' s y coloque una repetición ng en un elemento de opción:Como kludge , siempre se puede mover el atributo de nombre del elemento seleccionado a un elemento de entrada oculto:
fuente
"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."
. No se menciona el rendimiento, simplemente que ngOptions es una alternativa a ngRepeat.Puedes hacerlo:
- ACTUALIZACIÓN
Después de algunos cambios, el usuario frm.adiputra solución 's es mucho mejor. Código:
fuente
He luchado con este problema por un tiempo hoy. Leí la documentación de AngularJS, esta y otras publicaciones y algunos blogs a los que llevan. Todos me ayudaron a asimilar los detalles más finos, pero al final esto parece ser un tema confuso. Principalmente debido a los muchos matices sintácticos de
ng-options
.Al final, para mí, todo se redujo a menos es más.
Dado un alcance configurado de la siguiente manera:
Esto es todo lo que necesitaba para obtener el resultado deseado:
Aviso que no usé
track by
. El usotrack by
del elemento seleccionado siempre devolvería el objeto que coincidía con el ID de firmeza, en lugar del ID de firmeza mismo. Esto ahora cumple con mis criterios, que es que debería devolver un valor numérico en lugar del objeto, y usarng-options
para obtener la mejora del rendimiento que proporciona al no crear un nuevo alcance para cada opción generada.Además, necesitaba la primera fila en blanco, por lo que simplemente añadido una
<option>
a la<select>
elemento.Aquí hay un Plunkr que muestra mi trabajo.
fuente
En lugar de utilizar la nueva función 'seguimiento por', simplemente puede hacer esto con una matriz si desea que los valores sean los mismos que el texto:
Tenga en cuenta la diferencia entre la sintaxis estándar, que hará que los valores sean las claves del objeto / matriz y, por lo tanto, 0,1,2, etc. para una matriz:
k como v convierte en v como v .
Descubrí esto solo basado en el sentido común mirando la sintaxis. (k, v) es la declaración real que divide la matriz / objeto en pares de valores clave.
En la declaración 'k as v', k será el valor y v será la opción de texto que se muestra al usuario. Creo que 'track by' es desordenado y excesivo.
fuente
Esto fue el más adecuado para todos los escenarios según yo:
donde puede usar su modelo para vincular los datos. Obtendrá el valor que contendrá el objeto y la selección predeterminada según su escenario.
fuente
Así es como resolví esto. Rastreé la selección por valor y configuré la propiedad del elemento seleccionado para el modelo en mi código JavaScript.
vm
es mi controlador y el país en el controlador recuperado del servicio es{CountryId =1, Code = 'USA', CountryName='United States of America'}
.Cuando seleccioné otro país del menú desplegable de selección y publiqué mi página con "Guardar", obtuve el límite de país correcto.
fuente
La
ng-options
directiva no establece el atributo de valor en los<options>
elementos para matrices:Usando
limit.value as limit.text for limit in limits
medios:Consulte la pregunta sobre desbordamiento de pila. AngularJS ng-options no representa valores .
fuente
fuente
Puede usar ng-options para lograr seleccionar el enlace de la etiqueta al valor y mostrar miembros
Mientras usa esta fuente de datos
puede usar lo siguiente para vincular su etiqueta de selección al valor y al nombre
funciona muy bien
fuente
La respuesta correcta a esta pregunta ha sido proporcionada por el usuario frm.adiputra , ya que actualmente parece ser la única forma de controlar explícitamente el atributo de valor de los elementos de opción.
Sin embargo, solo quería enfatizar que "seleccionar" no es una palabra clave en este contexto, sino que es solo un marcador de posición para una expresión. Consulte la siguiente lista para ver la definición de la expresión "select" y otras expresiones que se pueden usar en la directiva ng-options.
El uso de select como se muestra en la pregunta:
Es esencialmente incorrecto.
Según la lista de expresiones, parece que trackexpr se puede usar para especificar el valor, cuando las opciones se dan en una matriz de objetos, pero se ha usado solo con agrupación.
De la documentación de AngularJS para ng-options:
fuente
Seleccionar un elemento en ng-options puede ser un poco complicado dependiendo de cómo configure la fuente de datos.
Después de luchar con ellos por un tiempo, terminé haciendo una muestra con las fuentes de datos más comunes que uso. Lo puedes encontrar aquí:
http://plnkr.co/edit/fGq2PM?p=preview
Ahora, para que las opciones ng funcionen, aquí hay algunas cosas a tener en cuenta:
key | label
. Muchos ejemplos en línea colocan los objetos como 'clave', y si necesita información del objeto, configúrelo de esa manera, de lo contrario, use la propiedad específica que necesita como clave. (ID, CÓDIGO, etc. Como en la muestra plckr)La forma de establecer el valor del control desplegable / de selección depende del n. ° 3,
$scope.dropdownmodel = $scope.user.state;
Si configura el objeto como clave, debe recorrer las opciones, incluso asignar el objeto no configurará el elemento como seleccionado, ya que tendrán diferentes hashkeys, por ejemplo:
Puede reemplazar savedValue para la misma propiedad en el otro objeto,
$scope.myObject.myProperty
.fuente
Para mí, la respuesta de Bruno Gomes es la mejor respuesta.
Pero en realidad, no necesita preocuparse por establecer la propiedad de valor de las opciones seleccionadas. AngularJS se encargará de eso. Déjame explicarte en detalle.
Por favor considere este violín
Como puede ver en la salida del violín, lo que elija para las opciones del cuadro de selección, es su valor personalizado o el valor 0, 1, 2 generado automáticamente por AngularJS, no importa en su salida a menos que esté utilizando jQuery o cualquier otra biblioteca para acceder al valor de las opciones del cuadro combinado seleccionado y manipularlo en consecuencia.
fuente
Un año después de la pregunta, tuve que encontrar una respuesta para esta pregunta, ya que ninguno de ellos dio la respuesta real, al menos para mí.
Ha preguntado cómo seleccionar la opción, pero nadie ha dicho que estas dos cosas NO son lo mismo:
Si tenemos opciones como esta:
E intentamos establecer una opción predeterminada como esta:
Será NO trabajar, pero si se intenta seleccionar la opción de la siguiente manera:
Será TRABAJAR .
A pesar de que estos dos objetos tienen las mismas propiedades, AngularJS los considera DIFERENTES porque AngularJS se compara por la referencia .
Eche un vistazo al violín http://jsfiddle.net/qWzTb/ .
fuente
Utilice el seguimiento por propiedad que diferencia los valores y las etiquetas en el cuadro de selección.
Por favor, inténtalo
que asignará etiquetas con texto y valor con valor (de la matriz)
fuente
Para un objeto:
fuente
Siempre es doloroso para los desarrolladores con ng-options. Por ejemplo: Obtener un valor seleccionado vacío / en blanco en la etiqueta de selección. Especialmente cuando se trata con objetos JSON en ng-options, se vuelve más tedioso. Aquí he hecho algunos ejercicios sobre eso.
Objetivo: iterar la matriz de objetos JSON a través de la opción ng y establecer el primer elemento seleccionado.
Datos:
En la etiqueta de selección tuve que mostrar xyz y abc, donde xyz debe seleccionarse sin mucho esfuerzo.
HTML:
Por ejemplo de código anterior, puede salir de esta exageración.
Otra referencia :
fuente
El tutorial ANGULAR.JS: NG-SELECT Y NG-OPTIONS me ayudó a resolver el problema:
fuente
fuente
Ejecute el fragmento de código y vea las variaciones. Aquí hay una nota para una comprensión rápida
Ejemplo 1 (Selección de objeto): -
ng-option="os.name for os in osList track by os.id"
. Aquítrack by os.id
es importante y debería estar allí yos.id as
NO debería haberlo hecho antesos.name
.ng-model="my_os"
debería establecerse en un objeto con clave como id comomy_os={id: 2}
.Ejemplo 2 (Selección de valor): -
ng-option="os.id as os.name for os in osList"
. Aquítrack by os.id
NO debería estar allí yos.id as
debería estar allí antesos.name
.ng-model="my_os"
debería establecerse en un valor comomy_os= 2
El fragmento de código de descanso lo explicará.
Mostrar fragmento de código
fuente
Como muchos dijeron antes, si tengo datos como este:
Lo usaría como:
En su controlador, debe establecer un valor inicial para deshacerse del primer elemento vacío:
fuente
Así es como resuelvo este problema en una aplicación heredada:
En HTML:
En JavaScript:
...
Mi HTML muestra el valor de la opción correctamente.
fuente
Directiva ngOptions:
Caso-1) etiqueta para el valor en la matriz:
Explicación de salida (Suponga que el primer elemento seleccionado):
selectedItem = {name: 'a', age: 20} // [por defecto, el elemento seleccionado es igual al elemento de valor ]
selectedItem.age = 20
Caso-2) seleccione como etiqueta para el valor en la matriz:
Explicación de salida (Suponga que el primer elemento seleccionado): selectedItem = 20 // [la parte seleccionada es item.age ]
fuente