Digamos que você tenha uma matriz que é renderizada em um ul
com um li
para cada elemento e uma propriedade no controlador chamada selectedIndex
. Qual seria a melhor maneira de adicionar uma classe ao li
índice selectedIndex
no AngularJS?
No momento, estou duplicando (manualmente) o li
código e adicionando a classe a uma das li
tags, usando ng-show
e ng-hide
para mostrar apenas uma li
por índice.
Respostas:
Se você não deseja colocar nomes de classes CSS no Controller, como eu, aqui está um truque antigo que eu uso desde os dias anteriores à v1. Podemos escrever uma expressão que seja avaliada diretamente em um nome de classe selecionado , nenhuma diretiva personalizada é necessária:
Observe a sintaxe antiga com dois pontos.
Há também uma nova maneira melhor de aplicar classes condicionalmente, como:
Angular agora suporta expressões que retornam um objeto. Cada propriedade (nome) deste objeto agora é considerada como um nome de classe e é aplicada dependendo do seu valor.
No entanto, essas maneiras não são funcionalmente iguais. Aqui está um exemplo:
Portanto, poderíamos reutilizar as classes CSS existentes, mapeando basicamente uma propriedade de modelo para um nome de classe e, ao mesmo tempo, mantendo as classes CSS fora do código do Controller.
fonte
($index==selectedIndex) ? 'selected' : ''
?{classname: '$index === selectedIndex'}
e não estava funcionando. Quando juntei tudo e usei == em vez de ===, funcionou.{classname: '$index==selectedIndex'}
A classe ng suporta uma expressão que deve ser avaliada para
Então, usando o formulário 3) podemos simplesmente escrever
Consulte também Como aplico condicionalmente estilos CSS no AngularJS? para uma resposta mais ampla.
Atualização : O Angular 1.1.5 adicionou suporte para um operador ternário , portanto, se essa construção é mais familiar para você:
fonte
ng-class="{'selected': $index==selectedIndex}"
trabalha para mimMeu método favorito é usar a expressão ternária.
Nota: Caso esteja usando uma versão mais antiga do Angular, você deve usá-lo,
fonte
ng-class="property.name=='timestamp' ? 'property-timestamp' : 'property-'+{{$index}}"
. Não foi possível descobrir de outra maneira.Vou acrescentar a isso, porque algumas dessas respostas parecem desatualizadas. Aqui está como eu faço:
Onde 'isSelected' é uma variável javascript definida no controlador angular com escopo definido.
Para abordar mais especificamente sua pergunta, veja como você pode gerar uma lista com isso:
HTML
JS
Veja: http://jsfiddle.net/tTfWM/
Veja: http://docs.angularjs.org/api/ng.directive:ngClass
fonte
ng-class:className
vs apenas usandoclass="{{className}}"
?Aqui está uma solução muito mais simples:
fonte
Enfrentei um problema semelhante recentemente e decidi criar apenas um filtro condicional:
É necessário um único argumento, que é uma matriz de 2 elementos ou uma sequência, que é transformada em uma matriz que é anexada a uma sequência vazia como o segundo elemento:
fonte
filter('yesNo', function() { return function(input) { // info('yesNo('+ input +')'); switch(input){ case '1': return ' yes '; break; default: return ' no '; break; } } });
Se você deseja ir além da avaliação binária e manter seu CSS fora do seu controlador, pode implementar um filtro simples que avalia a entrada em relação a um objeto de mapa:
Isso permite que você escreva sua marcação assim:
fonte
O que eu fiz recentemente foi o que estava fazendo isso:
O
isShowing
valor é um valor localizado no meu controlador que é alternado com o clique de um botão e as partes entre parênteses únicos são classes que eu criei no meu arquivo css.EDIT: Gostaria também de acrescentar que o codeschool.com tem um curso gratuito patrocinado pelo google no AngularJS que aborda todas essas coisas e mais algumas. Não há necessidade de pagar por nada, basta se inscrever em uma conta e seguir em frente! Boa sorte a todos!
fonte
isShowing
uma matriz no controlador?O operador ternário acabou de ser adicionado ao analisador angular no 1.1.5 .
Portanto, a maneira mais simples de fazer isso é agora:
fonte
class="otherClass ng-class:($index==selectedIndex)? 'selected' : '';"
.Podemos criar uma função para gerenciar a classe de retorno com a condição
E depois
Você pode consultar a página de código completa na classe ng, por exemplo
fonte
Eu sou novo no Angular, mas achei isso para resolver meu problema:
Isso aplicará condicionalmente uma classe com base em uma var. Começa com um download de ícone como padrão, a classe ng usando, verifico o status de
showDetails
setrue/false
e aplico o upload de ícones da classe . Está funcionando muito bem.Espero que ajude.
fonte
Isso funciona como um encanto;)
fonte
Isso provavelmente será reduzido para o esquecimento, mas aqui está como eu usei os operadores ternários do 1.1.5 para alternar classes, dependendo de uma linha em uma tabela ser a primeira, a média ou a última - exceto se houver apenas uma linha na tabela:
fonte
Este é no meu trabalho vários juízes condicionais:
fonte
Aqui está outra opção que funciona bem quando a classe ng não pode ser usada (por exemplo, ao estilizar SVG):
(Eu acho que você precisa estar no mais recente angular instável para usar ng-attr-, atualmente estou no 1.1.4)
fonte
Bem, eu sugiro que você verifique a condição no seu controlador com uma função retornando true ou false .
e no seu controlador verifique a condição
fonte
parcial
controlador
fonte
Se você estiver usando o angular pré v1.1.5 (ou seja, nenhum operador ternário) e ainda desejar uma maneira equivalente de definir um valor nas duas condições, poderá fazer algo assim:
fonte
Se você tiver uma classe comum aplicada a muitos elementos, poderá criar uma diretiva personalizada que irá adicionar essa classe como ng-show / ng-hide.
Esta diretiva adicionará a classe 'ativa' ao botão se for clicada
Mais informações
fonte
Apenas adicionando algo que funcionou para mim hoje, depois de muita pesquisa ...
Espero que isso ajude no seu desenvolvimento bem-sucedido.
=)
Sintaxe de expressão não documentada: ótimo link para o site ... =)
fonte
Verifique isso .
A infame
if|else
declaração AngularJS !!!Quando comecei a usar o Angularjs, fiquei um pouco surpreso por não encontrar uma instrução if / else.
Então, eu estava trabalhando em um projeto e notei que, ao usar a instrução if / else, a condição é exibida durante o carregamento. Você pode usar o ng-cloak para corrigir isso.
.ng-cloak { display: none }
Obrigado amadou
fonte
Você pode usar este pacote npm. Ele lida com tudo e tem opções para classes estáticas e condicionais com base em uma variável ou uma função.
fonte