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?

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


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


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


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>

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>

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


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


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


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

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

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!


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>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.