Eu li sobre isso em outros posts, mas não consegui descobrir.
Eu tenho uma matriz
$scope.items = [
{ID: '000001', Title: 'Chicago'},
{ID: '000002', Title: 'New York'},
{ID: '000003', Title: 'Washington'},
];
Eu quero renderizá-lo como:
<select>
<option value="000001">Chicago</option>
<option value="000002">New York</option>
<option value="000003">Washington</option>
</select>
E também quero selecionar a opção com o ID = 000002.
Eu li selecionar e tentei, mas não consigo descobrir.
javascript
angularjs
html-select
ng-options
Andrej Kaurin
fonte
fonte
Respostas:
Uma coisa a observar é que o ngModel é necessário para o ngOptions funcionar ... observe o
ng-model="blah"
que está dizendo "defina $ scope.blah com o valor selecionado".Tente o seguinte:
Aqui está mais da documentação do AngularJS (se você ainda não o viu):
Para algum esclarecimento sobre os valores das tags de opção no AngularJS:
Quando você usa
ng-options
, os valores das tags de opção gravados por ng-options sempre serão o índice do item da matriz à qual a tag de opção se refere . Isso ocorre porque o AngularJS realmente permite selecionar objetos inteiros com controles selecionados, e não apenas tipos primitivos. Por exemplo:A descrição acima permitirá que você selecione um objeto inteiro
$scope.selectedItem
diretamente. O ponto é que, com o AngularJS, você não precisa se preocupar com o que está em sua tag de opção. Deixe o AngularJS lidar com isso; você só deve se preocupar com o que está no seu modelo no seu escopo.Aqui está um plunker demonstrando o comportamento acima e mostrando o HTML gravado
Lidando com a opção padrão:
Há algumas coisas que não mencionei acima relacionadas à opção padrão.
Selecionando a primeira opção e removendo a opção vazia:
Você pode fazer isso adicionando um simples
ng-init
que define o modelo (deng-model
) para o primeiro elemento nos itens em que está repetindong-options
:Nota: Isso pode ficar um pouco louco, se
foo
for inicializado corretamente com algo "falso". Nesse caso, você desejará lidar com a inicialização dofoo
seu controlador, provavelmente.Customizando a opção padrão:
Isto é um pouco diferente; aqui tudo o que você precisa fazer é adicionar uma tag de opção como filho do seu select, com um atributo de valor vazio, e personalizar seu texto interno:
Nota: Nesse caso, a opção "vazia" permanecerá lá, mesmo depois que você selecionar uma opção diferente. Este não é o caso do comportamento padrão de seleções no AngularJS.
Uma opção padrão personalizada que oculta após a seleção ser feita:
Se você deseja que sua opção padrão personalizada desapareça depois de selecionar um valor, você pode adicionar um atributo ng-hide à sua opção padrão:
fonte
<option value="?" selected="selected"></option>
)?ng-if="foo"
precisar usarng-if=!foo
para ocultar a opção vazia padrão quando outra opção estiver selecionada. Além disso, a opção vazia padrão aparece sempre na parte inferior da lista de combinação. Como posso colocá-lo no início da lista de combinação?Estou aprendendo o AngularJS e também estava lutando com a seleção. Eu sei que essa pergunta já foi respondida, mas eu queria compartilhar mais um pouco de código.
No meu teste, tenho duas caixas de listagem: marcas de carros e modelos de carros. A lista de modelos é desativada até que alguma marca seja selecionada. Se a seleção na caixa de listagem make for redefinida posteriormente (definida como 'Select Make'), a caixa de listagem de modelos será desativada novamente E sua seleção também será redefinida (para 'Select Model'). As marcas são recuperadas como um recurso, enquanto os modelos são apenas codificados.
Faz JSON:
services.js:
Arquivo HTML:
controllers.js:
fonte
ng-model
deve apontar para outra variável no seu escopo, não relacionada amake
. Veja o exemplo em docs.angularjs.org/api/ng/directive/ngOptionsPor alguma razão, o AngularJS me deixa confuso. A documentação deles é horrível sobre isso. Mais bons exemplos de variações seriam bem-vindos.
De qualquer forma, tenho uma pequena variação na resposta de Ben Lesh.
Minhas coleções de dados são assim:
Agora
ainda resultou no valor das opções como o índice (0, 1, 2 etc.).
Adicionando faixa Por corrigido para mim:
Eu acho que acontece com mais frequência que você queira adicionar uma matriz de objetos a uma lista de seleção, por isso vou lembrar dessa!
Esteja ciente de que no AngularJS 1.4 você não pode mais usar ng-options, mas precisa usar
ng-repeat
sua tag de opção:fonte
option
?A pergunta já está respondida (BTW, resposta realmente boa e abrangente fornecida por Ben), mas eu gostaria de acrescentar outro elemento para completar, que também pode ser muito útil.
No exemplo sugerido por Ben:
a seguir ngOptions forma foi usado:
select as label for value in array
.Label é uma expressão cujo resultado será o rótulo do
<option>
elemento. Nesse caso, você pode executar certas concatenações de cadeias, para ter rótulos de opções mais complexos.Exemplos:
ng-options="item.ID as item.Title + ' - ' + item.ID for item in items"
fornece etiquetas comoTitle - ID
ng-options="item.ID as item.Title + ' (' + item.Title.length + ')' for item in items"
fornece rótulos comoTitle (X)
, ondeX
é o comprimento da cadeia de título.Você também pode usar filtros, por exemplo,
ng-options="item.ID as item.Title + ' (' + (item.Title | uppercase) + ')' for item in items"
fornece rótulos comoTitle (TITLE)
, onde o valor Título da propriedade Título e TITLE é o mesmo valor, mas convertido em caracteres maiúsculos.ng-options="item.ID as item.Title + ' (' + (item.SomeDate | date) + ')' for item in items"
fornece rótulos comoTitle (27 Sep 2015)
, se seu modelo tem uma propriedadeSomeDate
fonte
No CoffeeScript:
fonte
radix
paraparseInt
: http://davidwalsh.name/parseint-radixSe você precisar de um título personalizado para cada opção,
ng-options
não é aplicável. Em vez disso, useng-repeat
com as opções:fonte
Espero que o seguinte funcione para você.
fonte
Pode ser útil. As ligações nem sempre funcionam.
Por exemplo, você preenche o modelo de origem da lista de opções de um serviço REST. Um valor selecionado era conhecido antes de preencher a lista e foi definido. Depois de executar a solicitação REST com $ http, a opção de lista é concluída.
Mas a opção selecionada não está definida. Por razões desconhecidas, o AngularJS na execução de shadow $ digest não liga selecionado como deveria. Eu tenho que usar o jQuery para definir o selecionado. É importante! AngularJS, na sombra, adiciona o prefixo ao valor do "valor" attr para gerado pelas opções ng-repeat. Para int, é "number:".
fonte