Para caixas de seleção ng-model, ngTrueValue suporta apenas string. Ele deve realmente apenas aceitar uma expressão angular e eval para obter o valor para que ele suporte, digamos, um objeto js.
Não tenho certeza do propósito de ngTrueValue
, exceto que parece uma diretiva de conveniência para adicionar relógios a um controlador para um caso. Suspeito que, se você quiser definir algum modelo para um valor complexo, pode ser mais limpo colocar um $scope.$watch
no modelo da sua caixa de seleção e modificar um modelo no escopo de acordo.
@coli , você tem um caso de uso específico em mente? @IgorMinar , @mhevery , @vojtajina , o que vocês acham?
Caso de uso é bastante comum na verdade:
Eu tenho uma matriz de objetos de categoria digamos em $scope.categories=[{id:5,name:"First"},...}
Então eu tenho uma matriz selectedCategories que contém um subconjunto dessas categorias.
Eu quero mostrar uma caixa de seleção para algumas categorias (paginação), e quando você marca ou desmarca a caixa de seleção, selectedCategories é alterado.
Na verdade, escrevi uma diretiva que substituirá o comportamento padrão da caixa de seleção para adicionar suporte ao acima. Posso compartilhar o código se necessário.
Meu uso acabou assim, keyField era necessário para fazer comparação de objetos, pois no meu caso, o objeto de grupo selecionado e o objeto de grupo podem ser um pouco diferentes inicialmente (eles vieram de 2 APIs de back-end diferentes)
<ng-repeat="group in groups>
<input type='checkbox' ng-model="selectedArray" ng-true-value="group" mi-checkbox="{keyField:'id'}">
</>
Caramba, eu tenho um caso de uso muito mais simples que fiquei desapontado ao descobrir que não funciona - eu preciso de um inteiro, em vez de uma string!
Estou usando um modelo para renderizar um controle de caixa de seleção. Nesse caso, não posso saber o valor verdadeiro, esse valor depende de informações de controle específicas que quero renderizar.
Eu também preferiria que ng-true-value fosse uma expressão. Se o seu número de caixas de seleção for determinado em tempo de execução, você precisará recorrer a métodos de escopo com wrappers de tempo limite.
+1. Expressão de suporte em ng-true-value
+1 Suporta inteiro em ng-true-value
+1 para expressão em vez de string
+1 Expressões de suporte!
+1 para expressões
+1 Objetos de suporte:
<div ng-repeat="group in groups">
<input type='checkbox' ng-model="array[$index]" ng-true-value="group" />
</div>
@coli você se importaria de compartilhar a diretiva que você escreveu? Seria uma grande ajuda para mim enquanto este problema ainda está sendo considerado. Talvez em uma essência?
@brab Eu escrevi em um trabalho anterior infelizmente, mas basicamente, é semelhante ao código embutido para caixas de seleção, copiei/colei em uma diretiva personalizada e adicionei suporte a expressões. (+ um hack feio para remover o built-in)
Expressões seriam ótimas! No entanto, mesmo testes de verdade de javascript para números inteiros seriam esperados. Eu uso $resource para preencher um objeto que retorna valores inteiros (1 ou 0) de um banco de dados booleano. Estes são então anexados ao $scope para o qual o ng-model na entrada está vinculado. Fiquei realmente surpreso ao descobrir que a configuração de ng-true-value="1" não reconheceria o inteiro 1 como verdadeiro e marque a caixa. Analisaremos outros métodos mencionados nesse meio tempo.
+1
+1 para expressões
+1. Expressão de suporte em ng-true-value
+1 em expressões de apoio!
No meu caso, preciso construir um formulário dinamicamente.
Ex: http://jsfiddle.net/federosky/N8Wjm/5/
+1 para inteiro
1+ para inteiro
+1 para inteiro (ou qualquer número JS)
:+1: para expressões de apoio, por favor! por favor! por favoreee! :-)
+1 pelo menos para suporte a inteiros, de preferência expressões também.
Que tal alguém apresentar um PR para números de apoio?
+1 para expressões
+1 para inteiro
+1 para inteiro
+1
:+1: para expressões.
+1. Basta encontrar o problema quando tenho uma propriedade booleana 'oculta' que deve ser representada como caixa de seleção 'Visível' na página. Então, eu preciso do estado 'verificado' para significar FALSE e desmarcado para significar 'TRUE'.
Gostaria de saber o que seria uma solução fácil para este problema? Eu realmente não gosto de escrever minha própria diretiva de caixa de seleção ou poluir o escopo com as propriedades booleanas auxiliares inversas apenas para usá-las para ligação indireta.
Isso provavelmente é bastante trivial de implementar, vou tentar antes de dormir.
Meu patch suporta apenas expressões constantes, mas se as pessoas realmente precisarem, suponho que qualquer expressão seja suficiente. Esta foi a maneira mais fácil de não causar uma mudança de ruptura, no entanto.
+1
+1
+1
+1 para tipo inteiro
+1
+1 para expressões
+1
+1
+1
+1
:+1:
Estes são os hacks que são necessários agora (muitos WTFs):
<input type="checkbox" ng-model="fake" ng-checked="!notChecked" ng-change="notChecked = !notChecked"/>
+1
+1 já se passaram dois anos de "+1"s. Por que não estamos apoiando isso ainda?
@jancarloviray, +1
Muito ruim: Para mim, isso significa que as coisas ficaram mais complicadas.
Anteriormente eu usava
ng-true-value="{{proxyOnValue}}"
onde proxyOnValue foi inicializado em um controlador.
(A mesma visualização é reutilizada para configuração de proxy HTTP/HTTPS/FTP/POP3/SMTP onde o valor real é diferente.)
Agora eu tentei
ng-true-value="proxyOnValue"
mas isso lança uma exceção porque a expressão não é constante.
Então isso significa que eu tenho que substituir uma implementação simples (ngTrueValue) por uma implementação mais complexa (watch ou Object.defineProperty), então, na verdade, o oposto do que se pretendia.
Por que essa restrição artificial?
Somente
@eekboom - você ainda pode usar sua interpolação: http://plnkr.co/edit/LQ6OpFjkjiFLxxMJ9hxj?p=preview
@petebacondarwin - ele pode usar a interpolação, mas não o ajudará: http://plnkr.co/edit/nNwjEkPIDJwe60HWX950?p=preview
O valor é verificado apenas uma vez - as alterações posteriores não são levadas em consideração, portanto, apenas o valor inicial é usado sempre.
@dliebscher - meu entendimento era que @eekboom queria inicializá-lo apenas uma vez:
Anteriormente eu usei
ng-true-value="{{proxyOnValue}}"
onde proxyOnValue foi inicializado em um controlador.
Sim e não: quero inicializá-lo apenas uma vez, mas somente depois que a configuração do proxy for carregada via xhr. Portanto, ele muda (de indefinido) uma vez após a inicialização da exibição.
@eekboom
Quando eu estava migrando do 1.2, mudei para o seguinte:
ng-true-value="{{proxyOnValue}}"
para
ng-true-value="'{{proxyOnValue}}'"
O que funciona, mas parece idiota
Acabei de ter uma percepção interessante. O que eu estava tentando fazer - e pelo que parece, o que muitos de vocês estão tentando fazer - pode realmente ser realizado com:
ng-true-value="{{ myVariable | json }}"
Isso suporta valores de string, booleanos e números. Ainda não tenho certeza se realmente gosto disso, mas certamente achei divertido. E talvez isso ajude mais alguém.
getu-lar eu tentei o que você disse, com um objeto complexo, funciona. No valor ng-false eu preenchi com ng-false-value="{}"
.Antes de lidar com os dados, eu passo um filtro para cortar todos os valores falsos do array. Então, muito obrigado!
A solução do getu-lar funcionou para mim. Obrigado.
Eu estava tentando usar uma expressão que resolveu para uma string com sublinhado, por exemplo, "101_3". Eu usei a solução do getu-lar e simplesmente funciona. Parece um hack embora. Obrigado por compartilhá-lo!
+1 para expressões
+1
Não parece haver muita esperança para a equipe Angular fornecer uma diretiva de caixa de seleção sã para a série 1.x... Não pode ser muito difícil. O suporte a expressões seria totalmente compatível com versões anteriores devido à citação obrigatória.
Até então, a solução sugerida está funcionando para mim:
ng-true-value="{{ myVariable | json }}"
Certifique-se de que myVariable
esteja definido no controlador. Tentei definir no post-link e não funcionou.
Comentários muito úteis
Acabei de ter uma percepção interessante. O que eu estava tentando fazer - e pelo que parece, o que muitos de vocês estão tentando fazer - pode realmente ser realizado com:
Isso suporta valores de string, booleanos e números. Ainda não tenho certeza se realmente gosto disso, mas certamente achei divertido. E talvez isso ajude mais alguém.