cómo usar la opción ng para establecer el valor predeterminado del elemento seleccionado

148

He visto la documentación de la directiva Angular select aquí: http://docs.angularjs.org/api/ng.directive:select . No puedo entender cómo establecer el valor predeterminado. Esto es confuso:

seleccione como etiqueta para el valor en la matriz

Aquí está el objeto:

{
    "type": "select", 
    "name": "Service",
    "value": "Service 3", 
    "values": [ "Service 1", "Service 2", "Service 3", "Service 4"] 
}

El html (funcionando):

<select><option ng-repeat="value in prop.values">{{value}}</option></select>

y luego estoy tratando de agregar un atributo ng-option dentro del elemento select para establecerlo prop.valuecomo la opción predeterminada (no funciona).

ng-options="(prop.value) for v in prop.values"

¿Qué estoy haciendo mal?

François Romain
fuente

Respuestas:

131

Asumiendo que ese objeto está dentro de su alcance:

<div ng-controller="MyCtrl">
  <select ng-model="prop.value" ng-options="v for v in prop.values">
  </select>
</div>

 

function MyCtrl($scope) {
  $scope.prop = {
    "type": "select", 
    "name": "Service",
    "value": "Service 3", 
    "values": [ "Service 1", "Service 2", "Service 3", "Service 4"] 
  };
}

Plunkr de trabajo: http://plnkr.co/edit/wTRXZYEPrZJRizEltQ2g

James Kleeh
fuente
2
ok lo tengo el ng-optionestá reemplazando el <option ng-repeat="value in prop.values">{{value}}</option>agradecimiento nuevamente
François Romain
2
Tiene que haber una manera más simple de hacer esto, me parece muy complicado para un valor predeterminado de selección simple en angular js
Edmund Rojas
1
La directiva ng-option es algo complicada y confusa en su sintaxis. Creo que la flexibilidad para unir objetos lo ha complicado un poco. La forma en que trato de recordar esto es que cada vez que estoy usando un objeto, indico explícitamente qué propiedades usar para los atributos de valor / texto del control de selección. Para obtener más información, consulte esto: ozkary.com/2015/08/angularjs-ngoption-directive-simplified.html
ozkary
2
si desea crear una selección en la vista sin escribir las opciones y tener una seleccionada<select ng-model="limit" value="10" ng-options="v for v in [5,10,15,20,30,50]"></select>
asherrard
1
@james Kleeh ... aquí está codificando la primera opción ya que las conoce, pero si no conocemos las opciones y cómo podemos mostrar la primera por defecto.
H Varma
69

La documentación angular para select * no responde esta pregunta explícitamente, pero está ahí. Si miras el script.js, verás esto:

function MyCntrl($scope) {
  $scope.colors = [
    {name:'black', shade:'dark'},
    {name:'white', shade:'light'},
    {name:'red', shade:'dark'},
    {name:'blue', shade:'dark'},
    {name:'yellow', shade:'light'}
  ];
  $scope.color = $scope.colors[2]; // Default the color to red
}

Este es el html:

<select ng-model="color" ng-options="c.name for c in colors"></select>

Esta parece ser una forma más obvia de omitir un valor seleccionado en un <select>con ng-options. También funcionará si tiene diferentes etiquetas / valores.

* Esto es de Angular 1.2.7

Encadenar
fuente
Esto funcionó para mí, dudo que vuelva a aparecer, pero actualmente estoy usando AngularJS v1.2.27 en caso de que alguien encuentre esto y se pregunte sobre la compatibilidad.
Robert Cadmire
41

Esta respuesta es más útil cuando trae datos de una base de datos, realiza modificaciones y luego persiste los cambios.

 <select  ng-options="opt.id as opt.name for opt in users" ng-model="selectedUser"></select>

Mira el ejemplo aquí:

http://plnkr.co/edit/HrT5vUMJOtP9esGngbIV

Humberto Morera
fuente
Finalmente una respuesta funcional aquí, ¡votada! Además, con esta solución puede hacer que la opción indefinida funcione correctamente. <option value = ""> Seleccione </option>
DDD
Así que me alegro de que exista esta publicación, he estado buscando un tiempo para encontrar una solución y esta ha resuelto mi problema.
slee423
22
<select name='partyid' id="partyid" class='span3'>
<option value=''>Select Party</option>
<option ng-repeat="item in partyName" value="{{item._id}}" ng-selected="obj.partyname == item.partyname">{{item.partyname}}
</option>
</select>
nirav
fuente
55
Mala práctica aquí ... Eche un vistazo a la segunda nota amarilla: docs.angularjs.org/api/ng/directive/select .
M'sieur Toph '
esto no va a funcionar, ex. cuando intenta editar el registro, ¿cómo se unirá el registro con el campo?
windmaomao
21

Si su conjunto de objetos es complejo como:

$scope.friends = [{ name: John , uuid: 1234}, {name: Joe, uuid, 5678}];

Y su modelo actual se configuró en algo como:

$scope.user.friend = {name:John, uuid: 1234};

Ayudó a usar la track byfunción en uuid (o cualquier campo único), siempre que ng-model = "user.friend" también tenga un uuid:

<select ng-model="user.friend" 
ng-options="friend as friend.name for friend in friends track by friend.uuid"> 
</select>
Ácido de batería
fuente
Esta respuesta me alegró el día! También eche un vistazo al seguimiento en esta documentación: docs.angularjs.org/api/ng/directive/ngOptions
Arashsoft
¡Esta es la mejor respuesta!
Gerfried
10

Luché con esto durante un par de horas, por lo que me gustaría agregar algunas aclaraciones, todos los ejemplos que se mencionan aquí se refieren a casos en los que los datos se cargan desde el script en sí, no desde un servicio o una base de datos, así que me gustaría brindar mi experiencia a cualquiera que tenga el mismo problema que yo.

Normalmente solo guarda la identificación de la opción deseada en su base de datos, así que ... vamos a mostrarlo

service.js

myApp.factory('Models', function($http) {
var models = {};
models.allModels = function(options) {
    return $http.post(url_service, {options: options});
};

return models;
});

controller.js

myApp.controller('exampleController', function($scope, Models) {
$scope.mainObj={id_main: 1, id_model: 101};
$scope.selected_model = $scope.mainObj.id_model;
Models.allModels({}).success(function(data) {
    $scope.models = data; 
});
});

Finalmente el modelo html parcial.html

Model: <select ng-model="selected_model" 
ng-options="model.id_model as model.name for model in models" ></select>

básicamente quería señalar esa pieza " model.id_model como model.name para modelo en modelos ", el " model.id_model " usa el id del modelo para el valor para que pueda coincidir con el " mainObj.id_model " que también es el " selected_model ", este es solo un valor simple, también " as model.name " es la etiqueta para el repetidor, finalmente " model in models " es solo el ciclo regular que todos conocemos.

Espero que esto ayude a alguien, y si lo hace, vote: D

Wiston Coronell
fuente
1
simplemente puede vincular la selección a mainObj.id_modeldirectamente ( ng-model="mainObj.id_model"), en lugar de usar una variable 'marcador de posición / valor plano'selected_model
drzaus
sí, de hecho, solo quería mostrar que se podría hacer con un valor directamente dentro del $ alcance, pero gracias por señalarlo.
Wiston Coronell
¿Es posible unirse a un objeto y no solo a un int? No puedo hacer que mis nGoptions configuren su elemento seleccionado porque no sabe cómo vincular mi {id: 24} a mi [{id: 23}, {id: 24}, {id: 25}].
Victorio Berra
siempre puede usar $ index para obtener la posición, sin embargo, sí, es posible unirse a un objeto
Wiston Coronell
10
<select id="itemDescFormId" name="itemDescFormId" size="1" ng-model="prop" ng-change="update()">
    <option value="">English(EN)</option>
    <option value="23">Corsican(CO)</option>
    <option value="43">French(FR)</option>
    <option value="16">German(GR)</option>

Simplemente agregue la opción con valor vacío. Funcionará.

DEMO Plnkr

Surya R Praveen
fuente
Realmente funciona si agrega algo como<option value="" disabled>Please Select</option>
fWd82
9

Una manera más fácil de hacerlo es usar data-ng-init así:

<select data-ng-init="somethingHere = options[0]" data-ng-model="somethingHere" data-ng-options="option.name for option in options"></select>

La principal diferencia aquí es que necesitaría incluir data-ng-model

Wyetro
fuente
3
Como se especifica en los documentos: El único uso apropiado de ngInit es aliasar propiedades especiales de ngRepeat, como se ve en la demostración a continuación. Además de este caso, debe usar controladores en lugar de ngInit para inicializar valores en un ámbito.
user12121234
1
La forma en que publiqué, con ng-options es mucho más fácil y más concreta. Ambas formas funcionan.
Wyetro
3

El atributo ng-model establece la opción seleccionada y también le permite canalizar un filtro como orderBy: orderModel.value

index.html

<select ng-model="orderModel" ng-options="option.name for option in orderOptions"></select>

controllers.js

$scope.orderOptions = [
    {"name":"Newest","value":"age"},
    {"name":"Alphabetical","value":"name"}
];

$scope.orderModel = $scope.orderOptions[0];
David Douglas
fuente
1
Intentando esto y ya veo angular.js:117 TypeError: a.forEach is not a function. ¿Alguna idea?
carmenismo
1

Si alguien se encuentra con el valor predeterminado que ocasionalmente no se completa en la página en Chrome, IE 10/11, Firefox, intente agregar este atributo a su campo de entrada / selección para verificar la variable poblada en el HTML, de esta manera:

<input data-ng-model="vm.x" data-ng-if="vm.x !== '' && vm.x !== undefined && vm.x !== null" />
code_maestro
fuente
0

Realmente simple si no te importa indexar tus opciones con alguna identificación numérica.

  1. Declara tu $ scope var - matriz de personas

    $scope.people= ["", "YOU", "ME"];
  2. En el DOM del alcance anterior, cree un objeto

    <select ng-model="hired" ng-options = "who for who in people"></select>
  3. En su controlador, configura su modelo ng "contratado".

    $scope.hired = "ME";

¡¡¡Buena suerte!!! ¡Es realmente fácil!

Jenna Leaf
fuente
0

Solo para sumar, hice algo como esto.

 <select class="form-control" data-ng-model="itemSelect" ng-change="selectedTemplate(itemSelect)" autofocus>
        <option value="undefined" [selected]="itemSelect.Name == undefined" disabled="disabled">Select template...</option>
        <option ng-repeat="itemSelect in templateLists" value="{{itemSelect.ID}}">{{itemSelect.Name}}</option></select>
Tyne
fuente