como usar a opção ng para definir o valor padrão do elemento select

148

Eu já vi a documentação da diretiva de seleção Angular aqui: http://docs.angularjs.org/api/ng.directive:select . Não consigo descobrir como definir o valor padrão. Isso é confuso:

selecione como rótulo para o valor na matriz

Aqui está o objeto:

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

O html (funcionando):

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

e então estou tentando adicionar um atributo ng-option dentro do elemento select para definir prop.valuecomo a opção padrão (não está funcionando).

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

O que estou fazendo de errado?

François Romain
fonte

Respostas:

131

Então, supondo que o objeto esteja no seu escopo:

<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 trabalho: http://plnkr.co/edit/wTRXZYEPrZJRizEltQ2g

James Kleeh
fonte
2
OK, entendi! o ng-optionestá substituindo os <option ng-repeat="value in prop.values">{{value}}</option>agradecimentos novamente
François Romain
2
Não tem que ser uma maneira simples de fazer isso, eu acho isso muito complicado para um valor padrão seleto simples no js angulares
Edmund Rojas
1
A diretiva ng-option é um pouco complicada e confusa em sua sintaxe. Eu acho que a flexibilidade de vincular objetos tornou um pouco complicado. A maneira como tento me lembrar disso é que sempre que estou usando um objeto, indico explicitamente quais propriedades usar para os atributos de valor / texto do controle de seleção. Para obter mais informações, consulte: ozkary.com/2015/08/angularjs-ngoption-directive-simplified.html
ozkary
2
se você quiser construir uma escolha na vista sem escrever as opções e ter um selecionado<select ng-model="limit" value="10" ng-options="v for v in [5,10,15,20,30,50]"></select>
asherrard
1
@james Kleeh ..aqui você está codificando a primeira opção, desde que você os conheça. Mas se não sabemos as opções e como podemos exibir a primeira por padrão?
H Varma
69

A documentação angular para select * não responde explicitamente a essa pergunta, mas está lá. Se você olhar para o script.js, verá o seguinte:

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 é o html:

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

Essa parece ser uma maneira mais óbvia de padronizar um valor selecionado em um <select>com ng-options. Também funcionará se você tiver valores / rótulos diferentes.

* Isto é do Angular 1.2.7

Jess
fonte
Isso funcionou para mim, duvido que isso ocorra novamente, mas atualmente estou usando o AngularJS v1.2.27, caso alguém encontre isso e esteja pensando em compatibilidade.
Robert Cadmire 3/08
41

Essa resposta é mais útil quando você está trazendo dados de um banco de dados, faz modificações e depois persiste as alterações.

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

Veja o exemplo aqui:

http://plnkr.co/edit/HrT5vUMJOtP9esGngbIV

Humberto Morera
fonte
Finalmente, uma resposta de trabalho aqui, votada! Também com esta solução, você pode ter a opção indefinida funcionando corretamente. <option value = ""> Por favor, selecione </option>
DDD
Ainda bem que este post existe, estou pesquisando há algum tempo uma solução e esta resolveu meu 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
fonte
5
Má prática aqui ... Veja a segunda nota amarela: docs.angularjs.org/api/ng/directive/select .
M'sieur Toph '
isso não vai funcionar, ex. quando você tenta editar o registro, como o registro será vinculado ao campo?
windmaomao 11/02
21

Se sua matriz de objetos é complexa como:

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

E seu modelo atual foi definido para algo como:

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

Ajudou a usar a track byfunção no uuid (ou em qualquer campo exclusivo), desde que o ng-model = "user.friend" também tenha um uuid:

<select ng-model="user.friend" 
ng-options="friend as friend.name for friend in friends track by friend.uuid"> 
</select>
BatteryAcid
fonte
Esta resposta fez o meu dia! Também dê uma olhada em pista, nesta documentação: docs.angularjs.org/api/ng/directive/ngOptions
Arashsoft
Esta é a melhor resposta!
Gerfried 02/04
10

Eu lutei com isso por algumas horas, então gostaria de acrescentar alguns esclarecimentos, todos os exemplos mencionados aqui referem-se a casos em que os dados são carregados a partir do próprio script, não a algo proveniente de um serviço ou banco de dados, então, gostaria de fornecer minha experiência para qualquer pessoa que tenha o mesmo problema que eu.

Normalmente você salva apenas o ID da opção desejada no seu banco de dados, então ... vamos mostrá-lo

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, o html parcial model.html

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

basicamente, eu queria apontar essa peça " model.id_model como model.name para model nos modelos " the " model.id_model " usa o id do modelo para o valor, para que você possa combinar com o " mainObj.id_model ", que também é o " selected_model ", este é apenas um valor simples, também " as model.name " é o rótulo para o repetidor, finalmente " model in models " é apenas o ciclo regular que todos conhecemos.

Espero que isso ajude alguém e, se isso acontecer, vote: D

Wiston Coronell
fonte
1
você poderia simplesmente ligam a escolha para mainObj.id_modeldiretamente ( ng-model="mainObj.id_model"), em vez de usar um 'espaço reservado / valor plain' variávelselected_model
drzaus
sim, na verdade, eu só queria mostrar que isso poderia ser feito com um valor diretamente dentro do escopo $, mas obrigado por apontar isso.
Wiston Coronell
É possível vincular a um objeto e não apenas a um int? Não consigo que minhas nGoptions definam o item selecionado porque ele não sabe como vincular meu {id: 24} ao meu [{id: 23}, {id: 24}, {id: 25}].
Victorio Berra
você sempre pode usar $ index para obter a posição, no entanto, sim é possível vincular a um 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>

Basta adicionar a opção com valor vazio. Vai funcionar.

DEMO Plnkr

Surya R Praveen
fonte
Realmente funciona se você adicionar algo como<option value="" disabled>Please Select</option>
fWd82 17/17
9

Uma maneira mais fácil de fazer isso é usar o data-ng-init como este:

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

A principal diferença aqui é que você precisaria incluir data-ng-model

Wyetro
fonte
3
Conforme especificado nos documentos: O único uso apropriado de ngInit é para fazer alias de propriedades especiais do ngRepeat, como visto na demonstração abaixo. Além deste caso, você deve usar controladores em vez de ngInit para inicializar valores em um escopo.
user12121234
1
A maneira como eu postei, com as opções ng, é muito mais fácil e mais concreta. Os dois lados funcionam.
Wyetro 14/07/2015
3

O atributo ng-model define a opção selecionada e também permite canalizar um 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
fonte
1
Tentando isso e eu vejo angular.js:117 TypeError: a.forEach is not a function. Alguma ideia?
28417 carmenism
1

Se alguém estiver executando o valor padrão ocasionalmente não sendo preenchido na página no Chrome, IE 10/11, Firefox - tente adicionar este atributo ao seu campo de entrada / seleção, verificando a variável preenchida no HTML, da seguinte forma:

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

Realmente simples se você não se importa em indexar suas opções com algum ID numérico.

  1. Declare sua matriz $ scope var - people

    $scope.people= ["", "YOU", "ME"];
  2. No DOM do escopo acima, crie um objeto

    <select ng-model="hired" ng-options = "who for who in people"></select>
  3. No seu controlador, você define seu ng-model "contratado".

    $scope.hired = "ME";

Boa sorte!!! É realmente fácil!

Jenna Leaf
fonte
0

Só para adicionar, eu fiz algo parecido com isto.

 <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
fonte