Angular.js: Recurso: ngTrueValue deve aceitar valores não string

Criado em 25 jul. 2012  ·  60Comentários  ·  Fonte: angular/angular.js

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.

PRs plz! forms moderate feature

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:

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.

Todos 60 comentários

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

  • use o valor atual de ngTrueValue/ngFalseValue sempre que o modelo mudar ou o usuário clicar na caixa de seleção
  • para uma boa medida, tenha uma observação interna nas expressões ngTrueValue/ngFalseValue (se elas não forem constantes) e atualize o estado da caixa de seleção quando a observação for acionada.

@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.

Esta página foi útil?
0 / 5 - 0 avaliações