Eu tenho algumas caixas de seleção:
<input type='checkbox' value="apple" checked>
<input type='checkbox' value="orange">
<input type='checkbox' value="pear" checked>
<input type='checkbox' value="naartjie">
Que eu gostaria de vincular a uma lista no meu controlador, para que, sempre que uma caixa de seleção for alterada, o controlador mantenha uma lista de todos os valores verificados, por exemplo ['apple', 'pear']
,.
O ng-model parece apenas ser capaz de vincular o valor de uma única caixa de seleção a uma variável no controlador.
Existe outra maneira de fazer isso para que eu possa vincular as quatro caixas de seleção a uma lista no controlador?
javascript
angularjs
nickponline
fonte
fonte
<input type='checkbox' ng-model="checkboxes.apple">
, etc. Modelo seria: { "maçã": true, "laranja": false, "pêra": true "naartjie": true}naartjie
!? Isso apenas te deixa boet! : DRespostas:
Existem duas maneiras de abordar esse problema. Use uma matriz simples ou uma matriz de objetos. Cada solução tem prós e contras. Abaixo, você encontrará um para cada caso.
Com uma matriz simples como dados de entrada
O HTML pode se parecer com:
E o código do controlador apropriado seria:
Prós : estrutura de dados simples e alternar por nome é fácil de manusear
Contras : Adicionar / remover é complicado, pois duas listas (entrada e seleção) precisam ser gerenciadas
Com uma matriz de objetos como dados de entrada
O HTML pode se parecer com:
E o código do controlador apropriado seria:
Prós : Adicionar / remover é muito fácil
Contras : A estrutura de dados e a alternância de nomes um pouco mais complexas são complicadas ou exigem um método auxiliar
Demonstração : http://jsbin.com/ImAqUC/1/
fonte
value="{{fruit.name}}"
eng-checked="fruit.checked"
são supérfluos, já que o ng-model é usado.Uma solução simples:
http://plnkr.co/edit/U4VD61?p=preview
fonte
(color,enabled) in colors
faz?colors
é um objeto, quando você o itera - você recebe pares de(key,value)
.colors
deve ser nomeadoisSelected
, é muito mais fácil de lerisSelected[color]
do quecolors[color]
.
fonte
Aqui está uma pequena diretiva reutilizável rápida que parece fazer o que você está procurando. Eu simplesmente chamei isso
checkList
. Ele atualiza a matriz quando as caixas de seleção mudam e atualiza as caixas de seleção quando a matriz é alterada.Aqui está um controlador e uma exibição que mostra como você pode usá-lo.
(Os botões demonstram que alterar a matriz também atualizará as caixas de seleção.)
Finalmente, aqui está um exemplo da diretiva em ação no Plunker: http://plnkr.co/edit/3YNLsyoG4PIBW6Kj7dRK?p=preview
fonte
value: '@'
byvalue: '=ngValue'
Com base nas respostas deste tópico, criei a diretiva de modelo de lista de verificação que cobre todos os casos:
Para o caso de iniciador de tópicos, seria:
fonte
selectedFruits
.O uso de uma cadeia de caracteres
$index
pode ajudar a usar um mapa de hash dos valores selecionados:Dessa forma, o objeto ng-model é atualizado com a chave que representa o índice.
Depois de um tempo
$scope.someObject
deve ser algo como:Este método não funcionará para todas as situações, mas é fácil de implementar.
fonte
Como você aceitou uma resposta na qual uma lista não foi usada, assumirei que a resposta para minha pergunta de comentário é "Não, não precisa ser uma lista". Eu também tive a impressão de que talvez você estivesse renderizando o lado do servidor HTML, já que "marcado" está presente no seu exemplo de HTML (isso não seria necessário se ng-model fosse usado para modelar suas caixas de seleção).
Enfim, eis o que eu tinha em mente quando fiz a pergunta, assumindo também que você estava gerando o lado do servidor HTML:
O ng-init permite que o HTML gerado pelo servidor defina inicialmente determinadas caixas de seleção.
Violino .
fonte
Eu acho que a solução mais fácil seria usar 'select' com 'multiple' especificado:
Caso contrário, acho que você terá que processar a lista para construí-la (
$watch()
ligando a matriz do modelo às caixas de seleção).fonte
Eu adaptei a resposta aceita de Yoshi para lidar com objetos complexos (em vez de cadeias).
HTML
Javascript
Exemplo de trabalho: http://jsfiddle.net/tCU8v/
fonte
<input type="checkbox">
sem um embrulho ou correspondência<label>
! Agora, os usuários precisam clicar na caixa de seleção real, em vez do texto ao lado da caixa de seleção, o que é muito mais difícil e tem má usabilidade.Outra diretiva simples pode ser como:
O controlador:
E o HTML:
Também estou incluindo um Plunker: http://plnkr.co/edit/XnFtyij4ed6RyFwnFN6V?p=preview
fonte
A solução a seguir parece ser uma boa opção,
E no valor do modelo do controlador
fruits
será assimfonte
Você não precisa escrever todo esse código. O AngularJS manterá o modelo e as caixas de seleção sincronizadas simplesmente usando ngTrueValue e ngFalseValue
Codepen aqui: http://codepen.io/paulbhartzog/pen/kBhzn
Fragmento de código:
fonte
Confira esta diretiva que gerencia efetivamente listas de caixas de seleção. Espero que funcione para você. Modelo CheckList
fonte
Existe uma maneira de trabalhar diretamente na matriz e usar o ng-model ao mesmo tempo
ng-model-options="{ getterSetter: true }"
.O truque é usar uma função getter / setter no seu modelo ng. Dessa forma, você pode usar uma matriz como seu modelo real e "falsificar" os booleanos no modelo da entrada:
CAVEAT Você não deve usar esse método se suas matrizes forem grandes, como
myGetterSetter
será chamado muitas vezes.Para saber mais, consulte https://docs.angularjs.org/api/ng/directive/ngModelOptions .
fonte
Eu gosto da resposta de Yoshi. Eu o aprimorei para que você possa usar a mesma função para várias listas.
http://plnkr.co/edit/KcbtzEyNMA8s1X7Hja8p?p=preview
fonte
Se você tiver várias caixas de seleção no mesmo formulário
O código do controlador
Ver código
fonte
Inspirado no post de Yoshi acima. Aqui está o plnkr .
fonte
Com base no meu outro post aqui , fiz uma diretiva reutilizável.
Confira o repositório do GitHub
fonte
No HTML (supondo que as caixas de seleção estejam na primeira coluna de cada linha de uma tabela).
No
controllers.js
arquivo:fonte
Aqui está mais uma solução. A vantagem da minha solução:
Aqui está a diretiva:
No final, basta usá-lo assim:
E isso é tudo o que existe. A única adição é o
checkbox-array-set
atributofonte
Você pode combinar AngularJS e jQuery. Por exemplo, você precisa definir uma matriz
$scope.selected = [];
, no controlador.Você pode obter uma matriz que possui os itens selecionados. Usando o método
alert(JSON.stringify($scope.selected))
, você pode verificar os itens selecionados.fonte
fonte
Dê uma olhada neste: checklist-model .
Funciona com matrizes JavaScript e objetos e pode usar caixas de seleção HTML estáticas, sem ng-repeat
E o lado do JavaScript:
fonte
Uma única maneira simples de fazer isso em HTML:
fonte
Usando este exemplo do @Umur Kontacı, penso em usar para capturar dados selecionados em outro objeto / matriz, como uma página de edição.
Opções de captura no banco de dados
Alterne uma opção
Como exemplo, todas as cores json abaixo:
E 2 tipos de objeto de dados,
array
com um objeto eobject
contendo dois / mais dados de objeto:Dois itens selecionados foram capturados no banco de dados:
Um item selecionado foi capturado no banco de dados:
E aqui, meu código javascript:
Meu código HTML:
[Editar] Código refatorado abaixo:
E chame o novo método como abaixo:
É isso aí!
fonte
Eu coloquei uma matriz no controlador.
Na marcação, coloquei algo como seguir
A saída foi a seguinte, no controlador, eu só precisava verificar se é verdadeiro ou falso; verdadeiro para marcado, ausente / falso para não marcado.
Espero que isto ajude.
fonte
Eu acho que a seguinte maneira é mais clara e útil para repetições ng aninhadas. Confira no Plunker .
Citação deste tópico :
fonte
Aqui está o link jsFillde para o mesmo, http://jsfiddle.net/techno2mahi/Lfw96ja6/ .
Isso usa a diretiva que está disponível para download em http://vitalets.github.io/checklist-model/ .
É bom ter uma diretiva, pois seu aplicativo precisará dessa funcionalidade com muita frequência.
O código está abaixo:
HTML:
Javascript
fonte
<div>
que fechamento</div>
,. Você deixou algo de fora?Tente meu bebê:
**
**
Então, para qualquer modelo ng com caixas de seleção, ele retornará uma sequência de todas as entradas que você selecionou:
fonte