Estou tentando alternar a classe de um elemento usando ng-class
<button class="btn">
<i ng-class="{(isAutoScroll()) ? 'icon-autoscroll' : 'icon-autoscroll-disabled'}"></i>
</button>
isAutoScroll ():
$scope.isAutoScroll = function()
{
$scope.autoScroll = ($scope.autoScroll) ? false : true;
return $scope.autoScroll;
}
Basicamente, se $scope.autoScroll
for verdade, quero que a classe ng seja icon-autoscroll
e, se for falsa, quero que sejaicon-autoscroll-disabled
O que eu tenho agora não está funcionando e está produzindo esse erro no console
Error: Lexer Error: Unexpected next character at columns 18-18 [?] in expression [{(isAutoScroll()) ? 'icon-autoscroll' : 'icon-autoscroll-disabled'}].
Como faço isso corretamente?
EDITAR
solução 1: (desatualizada)
<button class="btn" ng-click="autoScroll = !autoScroll">
<i ng-class="{'icon-autoscroll': autoScroll, 'icon-autoscroll-disabled': !autoScroll}"></i>
</button>
EDIT 2
solução 2:
Eu queria atualizar a solução Solution 3
, pois , fornecida por Stewie, deveria ser a utilizada. É o mais padrão quando se trata de operador ternário (e para mim mais fácil de ler). A solução seria
<button class="btn" ng-click="autoScroll = !autoScroll">
<i ng-class="autoScroll ? 'icon-autoscroll' : 'icon-autoscroll-disabled'"></i>
</button>
traduz para:
if (autoScroll == true) ?
// classe de uso 'icon-autoscroll' :
// else use'icon-autoscroll-disabled'
fonte
angular expressions
por docs => Nenhuma declaração de fluxo de controle: você não pode executar nenhum dos seguintes procedimentos na expressão angular: condicionais, loops ou lançamento. Utilizar outra função ou diretivaautoScroll
aqui só terá efeito em cada botão? (Eu testei isso com vários botões, e funciona muito bem) Quero dizer, quando clico em cada botão, afeta apenas esse botão, em vez de todos os botões.Respostas:
Como usar condicional na classe ng:
Solução 1:
Solução 2:
Solução 3 (angular v.1.1.4 + introduzido suporte para operador ternário):
Plunker
fonte
Como solução alternativa, com base no operador lógico javascript '&&', que retorna a última avaliação, você também pode fazer o seguinte:
É apenas uma sintaxe um pouco mais curta, mas para mim é mais fácil de ler.
fonte
Adicione mais de uma classe com base na condição:
Aplique: class1 + class2 + class3 quando isNew = false ,
Aplicar: class1 + class4 quando isNew = true
fonte
De maneira análoga ao
toggleClass
método jQuery , essa é uma maneira de ativaractive
/ desativar a classe quando o elemento é clicado.fonte
A rolagem automática será definida e modificada no controlador.
<span ng-class= "autoscroll?'class_if_true':'class_if_false'"></span>
Adicione várias classes com base na condição:
<span ng-class= "autoscroll?'first second third':'classes_if_false'"></span>
fonte
Eu fiz este trabalho desta maneira:
// no seu controlador
fonte