Aqui está o que parece estar incomodando muitas pessoas (inclusive eu).
Ao usar a ng-options
diretiva no AngularJS para preencher as opções de uma <select>
tag, não consigo descobrir como definir o valor de uma opção. A documentação para isso é realmente incerta - pelo menos para um simplório como eu.
Posso definir o texto para uma opção facilmente assim:
ng-options="select p.text for p in resultOptions"
Quando resultOptions
é, por exemplo:
[
{
"value": 1,
"text": "1st"
},
{
"value": 2,
"text": "2nd"
}
]
Deve ser (e provavelmente é) a coisa mais simples para definir os valores das opções, mas até agora não entendi.
javascript
angularjs
Jukka Puranen
fonte
fonte
Respostas:
No seu caso, deve ser
Atualizar
Com as atualizações no AngularJS, agora é possível definir o valor real para o
value
atributo doselect
elemento comtrack by
expressão.Como se lembrar dessas coisas feias
Para todas as pessoas que estão tendo dificuldades para se lembrar desta forma de sintaxe: Concordo que essa não é a sintaxe mais fácil ou bonita. Essa sintaxe é uma espécie de versão estendida das compreensões de lista do Python e do conhecimento que me ajuda a lembrar a sintaxe com muita facilidade. É algo como isto:
Código Python:
Esta é realmente a mesma sintaxe que a primeira listada acima. No entanto,
<select>
geralmente precisamos diferenciar entre o valor real no código e o texto mostrado (o rótulo) em um<select>
elemento.Como, precisamos
person.id
no código, mas não queremos mostrarid
ao usuário; queremos mostrar o nome dele. Da mesma forma, não estamos interessados noperson.name
código. Aí vem aas
palavra-chave para rotular as coisas. Então fica assim:Ou, em vez de
person.id
precisarmos da própriaperson
instância / referência. Ver abaixo:Para objetos JavaScript, o mesmo método também se aplica. Lembre-se de que os itens no objeto são desconstruídos com
(key, value)
pares.fonte
Como o valor atribui seu valor:
Portanto, no seu caso, deve ser:
fonte
Eu também tive esse problema. Não consegui definir meu valor em ng-options. Todas as opções geradas foram configuradas com 0, 1, ..., n.
Para acertar, fiz algo parecido com isto nas minhas opções ng:
HTML:
Eu uso "rastrear por" para definir todos os meus valores com
room.price
.(Este exemplo é péssimo: porque se houvesse mais de um preço igual, o código falharia. Portanto, certifique-se de ter valores diferentes.)
JSON:
Aprendi no post do blog Como definir o valor inicial selecionado de um elemento de seleção usando as opções ng de Angular.JS e rastrear por .
Assista o vídeo. É uma ótima aula :)
fonte
Se você deseja alterar o valor de seus
option
elementos porque o formulário será enviado ao servidor, em vez de fazer isso,Você consegue fazer isso:
O valor esperado será enviado através do formulário com o nome correto.
fonte
<input type="hidden" name="text" value="{{ text }}" />
, eu usariang-value
. Assim:<input type="hidden" name="text" ng-value="{{ text }}" />
.Para enviar um valor personalizado chamado
my_hero
ao servidor usando um formulário normal, envie:JSON:
HTML:
O servidor receberá um
iron
ousuper
como o valor demy_hero
.Isso é semelhante à resposta de @neemzy , mas especificando dados separados para o
value
atributo.fonte
Parece
ng-options
complicado de usar (possivelmente frustrante), mas, na realidade, temos um problema de arquitetura.O AngularJS serve como uma estrutura MVC para um aplicativo HTML + JavaScript dinâmico. Embora seu componente (V) iew ofereça "modelagem" de HTML, seu principal objetivo é conectar as ações do usuário, através de um controlador, a alterações no modelo. Portanto, o nível apropriado de abstração, do qual trabalhar no AngularJS, é que um elemento de seleção define um valor no modelo para um valor de uma consulta .
ng-options
fornece afor
palavra-chave para ditar o que o conteúdo do elemento de opção deve ser istop.text for p in resultOptions
.ng-options
fornece aas
palavra-chave para especificar qual valor é fornecido ao modelo como emk as v for (k,v) in objects
.A solução correta para esse problema é de natureza arquitetônica e envolve a refatoração do HTML para que o (M) odel execute a comunicação do servidor quando necessário (em vez de o usuário enviar um formulário).
Se uma página HTML do MVC for desnecessária engenharia excessiva para o problema em questão: use apenas a parte de geração HTML do componente iew do AngularJS (V). Nesse caso, siga o mesmo padrão usado para gerar elementos como
<li />
's under<ul />
' e coloque um ng-repeat em um elemento opcional:Como kludge , sempre é possível mover o atributo name do elemento select para um elemento de entrada oculto:
fonte
"Note: ngOptions provides an iterator facility for the <option> element which should be used instead of ngRepeat when you want the select model to be bound to a non-string value. This is because an option element can only be bound to string values at present."
. Não há menção de desempenho, apenas que ngOptions é uma alternativa ao ngRepeat.Você consegue fazer isso:
- ATUALIZAÇÃO
Após algumas atualizações, a solução do usuário frm.adiputra é muito melhor. Código:
fonte
Hoje luto com esse problema. Eu li a documentação do AngularJS, esta e outras postagens e alguns blogs que eles levam. Todos eles me ajudaram a detalhar os detalhes, mas no final isso parece ser um tópico confuso. Principalmente por causa das muitas nuances sintáticas de
ng-options
.No final, para mim, tudo se reduz a menos.
Dado um escopo configurado da seguinte maneira:
Isso é tudo o que eu precisava para obter o resultado desejado:
Observe que eu não usei
track by
. O usotrack by
do item selecionado sempre retornaria o objeto que correspondia ao FirmnessID, em vez do FirmnessID. Isso agora atende aos meus critérios, que é que ele retorne um valor numérico em vez do objeto, e useng-options
para obter a melhoria de desempenho que ele fornece, não criando um novo escopo para cada opção gerada.Além disso, eu precisava da primeira linha em branco, então simplesmente adicionei um
<option>
ao<select>
elemento.Aqui está um Plunkr que mostra o meu trabalho.
fonte
Em vez de usar o novo recurso 'rastrear por', você pode simplesmente fazer isso com uma matriz se quiser que os valores sejam os mesmos do texto:
Observe a diferença entre a sintaxe padrão, que tornará os valores as chaves do objeto / matriz e, portanto, 0,1,2 etc. para uma matriz:
k como v se torna v como v .
Descobri isso apenas com base no senso comum, observando a sintaxe. (k, v) é a instrução real que divide a matriz / objeto em pares de valores-chave.
Na instrução 'k as v', k será o valor ev será a opção de texto exibida ao usuário. Eu acho que 'rastrear' é bagunçado e exagerado.
fonte
Isso foi mais adequado para todos os cenários, de acordo comigo:
onde você pode usar seu modelo para ligar os dados. Você obterá o valor que o objeto conterá e a seleção padrão com base no seu cenário.
fonte
Foi assim que resolvi isso. Acompanhei a seleção por valor e configurei a propriedade do item selecionado para o modelo no meu código JavaScript.
vm
é meu controlador e o país no controlador recuperado do serviço é{CountryId =1, Code = 'USA', CountryName='United States of America'}
.Quando selecionei outro país no menu suspenso de seleção e postei minha página com "Salvar", vinculei o país correto.
fonte
A
ng-options
diretiva não define o atributo value nos<options>
elementos para matrizes:Usando
limit.value as limit.text for limit in limits
meios:Consulte a pergunta Estouro de pilha: ng-options do AngularJS não renderizando valores .
fonte
fonte
Você pode usar ng-options para obter a ligação de tag select para valorizar e exibir membros
Ao usar essa fonte de dados
você pode usar o abaixo para vincular sua tag de seleção ao valor e nome
funciona muito bem
fonte
A resposta correta para esta pergunta foi fornecida pelo usuário frm.adiputra , pois atualmente essa parece ser a única maneira de controlar explicitamente o atributo value dos elementos da opção.
No entanto, eu só queria enfatizar que "selecionar" não é uma palavra-chave nesse contexto, mas é apenas um espaço reservado para uma expressão. Por favor, consulte a lista a seguir, para a definição da expressão "select", bem como outras expressões que podem ser usadas na diretiva ng-options.
O uso de select, conforme descrito na pergunta:
está essencialmente errado.
Com base na lista de expressões, parece que trackexpr pode ser usado para especificar o valor, quando as opções são fornecidas em uma matriz de objetos, mas foi usado apenas com o agrupamento.
Na documentação do AngularJS para ng-options:
fonte
Selecionar um item nas opções ng pode ser um pouco complicado, dependendo de como você define a fonte de dados.
Depois de lutar com eles por um tempo, acabei fazendo uma amostra com as fontes de dados mais comuns que eu uso. Você pode encontrá-lo aqui:
http://plnkr.co/edit/fGq2PM?p=preview
Agora, para fazer o ng-options funcionar, aqui estão algumas coisas a considerar:
key | label
. Muitos exemplos online colocam objetos como 'chave' e, se você precisar de informações do objeto, defina-as dessa maneira, caso contrário, use a propriedade específica necessária como chave. (ID, CÓDIGO, etc. Como na amostra plckr)A maneira de definir o valor do controle suspenso / selecionar depende do número 3,
$scope.dropdownmodel = $scope.user.state;
Se você definir o objeto como chave, precisará percorrer as opções, mesmo atribuir o objeto não definirá o item como selecionado, pois eles terão diferentes hashkeys, por exemplo:
Você pode substituir saveValue pela mesma propriedade no outro objeto
$scope.myObject.myProperty
,.fonte
Para mim, a resposta de Bruno Gomes é a melhor resposta.
Mas, na verdade, você não precisa se preocupar em definir a propriedade value das opções selecionadas. O AngularJS cuidará disso. Deixe-me explicar em detalhes.
Por favor, considere este violino
Como você pode ver na saída do violino, o que você escolher para as opções da caixa de seleção, é o seu valor personalizado, ou o valor 0, 1, 2 gerado automaticamente pelo AngularJS, não importa na saída, a menos que você esteja usando jQuery ou qualquer outro outra biblioteca para acessar o valor dessas opções da caixa de combinação e manipulá-lo de acordo.
fonte
Um ano após a pergunta, tive que encontrar uma resposta para essa pergunta, pois nenhuma delas deu a resposta real, pelo menos para mim.
Você perguntou como selecionar a opção, mas ninguém disse que essas duas coisas NÃO são iguais:
Se tivermos opções como esta:
E tentamos definir uma opção padrão como esta:
Vai NÃO funcionar, mas se você tentar selecionar a opção como esta:
Ele vai TRABALHAR .
Embora esses dois objetos tenham as mesmas propriedades, o AngularJS os considera DIFERENTES porque o AngularJS é comparado pela referência .
Dê uma olhada no violino http://jsfiddle.net/qWzTb/ .
fonte
Por favor, use trilha por propriedade que diferencia valores e rótulos na caixa de seleção.
Tente por favor
que atribuirá rótulos com texto e valor com valor (da matriz)
fonte
Para um objeto:
fonte
É sempre doloroso para os desenvolvedores com ng-options. Por exemplo: Obter um valor selecionado em branco / vazio na tag de seleção. Especialmente ao lidar com objetos JSON em ng-options, torna-se mais tedioso. Aqui eu fiz alguns exercícios sobre isso.
Objetivo: Iterar a matriz de objetos JSON por meio da opção ng e definir o primeiro elemento selecionado.
Dados:
Na tag select, tive que mostrar xyz e abc, onde xyz deve ser selecionado sem muito esforço.
HTML:
Pelo exemplo de código acima, você pode sair desse exagero.
Outra referência :
fonte
O tutorial ANGULAR.JS: NG-SELECT E NG-OPTIONS me ajudou a resolver o problema:
fonte
fonte
Execute o trecho de código e veja as variações. Aqui está uma nota para uma compreensão rápida
Exemplo 1 (seleção de objeto): -
ng-option="os.name for os in osList track by os.id"
. Aquitrack by os.id
é importante e deve estar lá eos.id as
não deve ter antesos.name
.ng-model="my_os"
deve definir a um objeto com a chave como id comomy_os={id: 2}
.Exemplo 2 (seleção de valor): -
ng-option="os.id as os.name for os in osList"
. Aquitrack by os.id
NÃO deve estar lá eos.id as
deve estar lá antesos.name
.ng-model="my_os"
deve ser definido como um valor comomy_os= 2
O trecho de código de restante explicará.
Mostrar snippet de código
fonte
Como muitos disseram antes, se eu tiver dados, algo como isto:
Eu usaria como:
No seu Controller, você precisa definir um valor inicial para se livrar do primeiro item vazio:
fonte
Aqui está como eu resolvo esse problema em um aplicativo herdado:
Em HTML:
Em JavaScript:
...
Meu HTML exibe o valor da opção corretamente.
fonte
Diretiva ngOptions:
Case-1) rótulo para valor na matriz:
Explicação da saída (suponha o 1º item selecionado):
selectedItem = {name: 'a', age: 20} // [por padrão, o item selecionado é igual ao item de valor ]
selectedItem.age = 20
Caso-2) selecione como rótulo para o valor na matriz:
Explicação de saída (suponha o 1º item selecionado): selectedItem = 20 // [selecionar parte é item.age ]
fonte