Trabalho com o AngularJS há algumas semanas, e o que realmente me incomoda é que, mesmo depois de tentar todas as permutações ou a configuração definida na especificação em http://docs.angularjs.org/api/ng .directive: select , ainda recebo uma opção vazia como o primeiro filho do elemento select.
Aqui está o Jade:
select.span9(ng-model='form.type', required, ng-options='option.value as option.name for option in typeOptions');
Aqui o controlador:
$scope.typeOptions = [
{ name: 'Feature', value: 'feature' },
{ name: 'Bug', value: 'bug' },
{ name: 'Enhancement', value: 'enhancement' }
];
Finalmente, aqui está o HTML que é gerado:
<select ng-model="form.type" required="required" ng-options="option.value as option.name for option in typeOptions" class="span9 ng-pristine ng-invalid ng-invalid-required">
<option value="?" selected="selected"></option>
<option value="0">Feature</option>
<option value="1">Bug</option>
<option value="2">Enhancement</option>
</select>
O que preciso fazer para me livrar dele?
PS: As coisas funcionam sem isso também, mas parece estranho se você usar select2 sem seleção múltipla.
null
é um dos seus valores.<option>
assim tat angular gerado algo como<option value="?">Select an option</option>
<option value="">Select an option</option>
o valor nulo da lista de opções. Não há necessidade de caracteres?Se você deseja um valor inicial, consulte a resposta de @ pkozlowski.opensource, que também pode ser implementada na FYI na exibição (e não no controlador) usando ng-init:
Se você não deseja um valor inicial, "um único elemento codificado, com o valor definido como uma sequência vazia, pode ser aninhado no elemento. Esse elemento representará a opção nula ou" não selecionada "":
fonte
Angular <1.4
Para qualquer pessoa que trate "null" como valor válido para uma das opções (imagine que "null" seja um valor de um dos itens em typeOptions no exemplo abaixo), achei a maneira mais simples de garantir que a adição automática fosse feita. opção está oculta é usar ng-if.
Por que ng-if e não ng-hide? Como você deseja que os seletores de css que segmentam a primeira opção acima, selecione a opção "real", não a que está oculta. Torna-se útil quando você usa o transferidor para o teste e2e e (por qualquer motivo) usa o by.css () para direcionar as opções selecionadas.
Angular> = 1.4
Devido à refatoração das diretivas de seleção e opções, o uso
ng-if
não é mais uma opção viável, portanto você precisa voltarng-show="false"
a fazê-lo funcionar novamente.fonte
size="5"
os atributos seleciona e pode ver que não há nada selecionado! Como em um elemento padrão<select>
! Eu não consigo entender porque angular está fazendo tal coisa para seleciona semmultiple
atributo ...Talvez útil para alguém:
Se você quiser usar opções simples em vez de ng-options, faça o seguinte:
Defina o modelo em linha. Use ng-init para se livrar da opção vazia
fonte
Algo semelhante estava acontecendo comigo também e foi causado por uma atualização para o angular 1.5.
ng-init
parece estar sendo analisado para o tipo nas versões mais recentes do Angular. No antigo, o Angular mapeavang-init="myModelName=600"
para uma opção com o valor "600", ou seja,<option value="600">First</option>
mas no Angular 1.5, não o encontrará, pois parece estar esperando encontrar uma opção com o valor 600, ou seja<option value=600>First</option>
. O Angular insere um primeiro item aleatório:Angular <1.2.x
Angular> 1,2
fonte
ng-value="600"
nooption
lugar devalue
. Ele vai analisá-lo para um número e você não tem que converter seus valores, como você faz agora :)Entre as inúmeras respostas aqui, imaginei que repassaria a solução que funcionou para mim e atendeu a todas as seguintes condições:
value=""
)código
src
Perguntas e respostas originais - https://stackoverflow.com/a/32880941/1121919
fonte
<option ng-selected="true" value="null">
?Uma solução rápida:
Espero que ajude alguém. Idealmente, a resposta selecionada deve ser a abordagem, mas se isso não for possível, deve funcionar como um patch.
fonte
Sim ng-model criará um valor de opção vazio, quando a propriedade ng-model não estiver definida. Podemos evitar isso, se atribuirmos objeto ao ng-model
Exemplo
codificação angular
Nota importante:
Atribua o objeto da matriz como $ scope.collections [0] ou $ scope.collections [1] ao ng-model, não use propriedades do objeto. se você estiver obtendo o valor da opção de seleção do servidor, usando a função de retorno de chamada, atribua o objeto ao ng-model
NOTA do documento Angular
Nota: ngModel é comparado por referência, não por valor. Isso é importante ao vincular a uma matriz de objetos. veja um exemplo http://jsfiddle.net/qWzTb/
Eu tentei muitas vezes, finalmente encontrei.
fonte
Embora as respostas de @ pkozlowski.opensource e de @ Mark estejam corretas, eu gostaria de compartilhar minha versão ligeiramente modificada, onde sempre seleciono o primeiro item da lista, independentemente de seu valor:
fonte
Estou usando o Angular 1.4x e encontrei este exemplo, então usei o ng-init para definir o valor inicial no select:
fonte
Eu enfrentei o mesmo problema. Se você estiver postando um formulário angular com postagem normal, enfrentará esse problema, pois o angular não permite definir valores para as opções da maneira que você usou. Se você obtiver o valor de "form.type", encontrará o valor certo. Você precisa postar o objeto angular e não o post do formulário.
fonte
Uma solução simples é definir uma opção com um valor em branco
""
que achei que elimina a opção indefinida extra.fonte
Ok, na verdade a resposta é bem simples: quando existe uma opção não reconhecida pela Angular, ela inclui uma opaca. O que você está fazendo de errado é que, quando você usa ng-options, ele lê um objeto, digamos
[{ id: 10, name: test }, { id: 11, name: test2 }] right?
É isso que o valor do seu modelo precisa para avaliá-lo como igual, digamos que você queira que o valor selecionado seja 10, você precisa definir seu modelo para um valor semelhante
{ id: 10, name: test }
a selecionar 10, portanto, NÃO criará esse lixo.Espero que ajude todos a entender, tive um tempo difícil tentando :)
fonte
Esta solução funciona para mim:
fonte
Isso funcionou para mim
fonte
Isso funciona perfeitamente bem
da maneira que funciona, isso fornece a primeira opção a ser exibida antes de selecionar algo e a
display:none
remove do menu suspenso. Se você quiser, pode fazere isso fornecerá o
select and option
antes de selecionar, mas uma vez selecionado, ele desaparecerá e não será exibido no menu suspenso.fonte
Tente este no seu controlador, na mesma ordem:
fonte
Aqui está a correção:
para uma amostra de dados como:
A opção de seleção deve ser assim: -
O ponto é que, quando escrevemos
value.listCount
comovalue.listName
, ele preenche automaticamente o texto,value.listName
mas o valor da opção selecionada évalue.listCount
embora os valores my show normal 0,1,2 .. e assim por diante !!!No meu caso, o
financeRef.financeLimit
está realmente pegando ovalue.listCount
e posso fazer minha manipulação dinamicamente no controlador.fonte
Gostaria de acrescentar que, se o valor inicial vier de uma ligação de algum elemento pai ou componente 1.5, verifique se o tipo correto é passado. Se estiver usando
@
ligação, a variável passada será string e se as opções forem, por exemplo. inteiros, a opção vazia será exibida.Analise adequadamente o valor em init ou vincule-o
<
e não@
(menos recomendado para desempenho, a menos que seja necessário).fonte
Solução simples
fonte
Uma solução de moagem com jQuery quando você não tem o controle das opções
html:
js:
fonte
Se você usa ng-init, seu modelo para resolver este problema:
fonte
eu tive o mesmo problema, eu (removido "ng-model") mudei isso:
para isso:
agora está funcionando, mas no meu caso foi porque eu excluí esse escopo do ng.controller, verifique se você não fez o mesmo.
fonte
Oi, eu tinha algumas referências móveis jQUery e eu os removi. Com o jQuery mobile, qualquer uma das correções acima não funcionou para mim. (É ótimo se alguém puder explicar o conflito entre o jQuery Mobile e o Angular JS)
https://guntucomputerhacks.blogspot.com.au/2017/10/angular-js-drop-down-first-options-vs.html
fonte
A única coisa que funcionou para mim está usando
track by
emng-options
, como este:fonte
ng-option
obtenha o último valor da matriz da qual desejo definir o valoroption
deselect
. Não resolveu :(Consulte o exemplo da documentação do angularjs como superar esses problemas.
Funciona para mim. Também pode ver como funciona aqui
fonte
Podemos usar CSS para ocultar a primeira opção, mas não funcionará no IE 10, 11. A melhor maneira é remover o elemento usando o Jquery. Esta solução funciona para os principais navegadores testados no chrome e IE10, 11
Além disso, se você estiver usando angular, em algum momento usando setTimeout funcionará
fonte