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?

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


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


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


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>

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>

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


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


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


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];

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" />

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!


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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.