Classe de alternância do AngularJS usando a classe ng

217

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.autoScrollfor verdade, quero que a classe ng seja icon-autoscrolle, 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'

Ronnie
fonte
não é possível usar condicionais em angular expressionspor 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 diretiva
charlietfl
@ Ronnie, vi sua solução e foi muito legal. mas eu me pergunto por que o autoScrollaqui 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.
Zx1986

Respostas:

436

Como usar condicional na classe ng:

Solução 1:

<i ng-class="{'icon-autoscroll': autoScroll, 'icon-autoscroll-disabled': !autoScroll}"></i>

Solução 2:

<i ng-class="{true: 'icon-autoscroll', false: 'icon-autoscroll-disabled'}[autoScroll]"></i>

Solução 3 (angular v.1.1.4 + introduzido suporte para operador ternário):

<i ng-class="autoScroll ? 'icon-autoscroll' : 'icon-autoscroll-disabled'"></i>

Plunker

Stewie
fonte
3
O segundo exemplo é mais limpo, mas é ridículo que você não possa colocar a variável que está avaliando na frente da expressão ... é apenas engraçado. Imagine olhar para a expressão como uma instrução if: "se (variável) true: fazer isso, falsa: fazer isso ... #fullynerdy ugh
mattdlockyer
10
@Stewie Faaakin lindo companheiro, amor como ele se parece código real e não alguma marcação expressão bastardized: D
mattdlockyer
Avaliar realmente o valor primeiro é bastante útil, pois evita atribuir acidentalmente um novo valor à variável.
Lharby # 23/15
Ternário é exatamente o que eu estava procurando. Bom trabalho, fornecendo três exemplos com os detalhes de suporte da versão.
TaeKwonJoe 25/02
13

Como solução alternativa, com base no operador lógico javascript '&&', que retorna a última avaliação, você também pode fazer o seguinte:

<i ng-class="autoScroll && 'icon-autoscroll' || !autoScroll && 'icon-autoscroll-disabled'"></i>

É apenas uma sintaxe um pouco mais curta, mas para mim é mais fácil de ler.

Lukus
fonte
10

Adicione mais de uma classe com base na condição:

<div ng-click="AbrirPopUp(s)" 
ng-class="{'class1 class2 class3':!isNew, 
           'class1 class4': isNew}">{{ isNew }}</div>

Aplique: class1 + class2 + class3 quando isNew = false ,

Aplicar: class1 + class4 quando isNew = true

RolandoCC
fonte
6
<div data-ng-init="featureClass=false" 
     data-ng-click="featureClass=!featureClass" 
     data-ng-class="{'active': featureClass}">
    Click me to toggle my class!
</div>

De maneira análoga ao toggleClassmétodo jQuery , essa é uma maneira de ativar active/ desativar a classe quando o elemento é clicado.

Pavel Levin
fonte
2
Você poderia fornecer mais informações sobre sua resposta em inglês? Qual é a diferença das respostas que já estão aqui?
Onots
2
Não sei por que essa resposta tem muitos votos negativos? Esta é a solução que realmente funcionou melhor para mim do que os outros acima ...
Paulo Griiettner
2
Acho que a descrição está mal escrita e as pessoas reagem à palavra "jQuery" .O que a descrição pretende dizer é "Isso é análogo à função toggleClass no JQuery". BTW, você precisa iniciar a variável?
Design by Adrian
1

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>

Harshit Pant
fonte
-1

Eu fiz este trabalho desta maneira:

<button class="btn" ng-click='toggleClass($event)'>button one</button>
<button class="btn" ng-click='toggleClass($event)' >button two</button>

// no seu controlador

 $scope.toggleClass = function (event){
        $(event.target).toggleClass('active');
    }
Ruhul Amin
fonte
2
Enquanto isso funciona, você está misturando angular e jQuery. Você deve tentar evitar isso, se puder. O que foi originalmente solicitado pode ser feito sem um evento de clique. E se você tiver outro botão que deve alternar essa classe no seu botão acima? Não vai atualizar agora porque você está mudando-o em clique e não através ng-class
Ronnie
1
É do jqLite. Para mais docs.angularjs.org/api/ng/function/angular.element
Ruhul Amin
1
Compreendo. Meu argumento é que você não precisa usar nada do jQuery para obter a resposta para a pergunta original.
217 Ronnie