AngularJS bascule la classe en utilisant la classe ng

217

J'essaie de basculer la classe d'un élément en utilisant 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;
}

Fondamentalement, si $scope.autoScrollc'est vrai, je veux que ng-class soit icon-autoscrollet si c'est faux, je veux que ce soiticon-autoscroll-disabled

Ce que j'ai maintenant ne fonctionne pas et génère cette erreur dans la console

Error: Lexer Error: Unexpected next character at columns 18-18 [?] in expression [{(isAutoScroll()) ? 'icon-autoscroll' : 'icon-autoscroll-disabled'}].

Comment dois-je procéder correctement?

ÉDITER

solution 1: (obsolète)

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

EDIT 2

solution 2:

Je voulais mettre à jour la solution car Solution 3, fournie par Stewie, devrait être celle utilisée. C'est le plus standard en ce qui concerne l'opérateur ternaire (et pour moi le plus facile à lire). La solution serait

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

Se traduit par:

if (autoScroll == true) ?// utilise la classe 'icon-autoscroll' :// sinon utilise'icon-autoscroll-disabled'

Ronnie
la source
ne peut pas utiliser de conditions dans angular expressionsper docs => Aucune instruction de flux de contrôle: vous ne pouvez pas effectuer l'une des opérations suivantes dans l'expression angulaire: conditions, boucles ou lancer. Utilisez une autre fonction ou directive
charlietfl
@Ronnie J'ai vu votre solution et c'était tellement cool. mais je me demande pourquoi l' autoScrollici n'aura d'effet que sur chaque bouton? (J'ai testé cela avec plusieurs boutons, et cela fonctionne bien aussi) Je veux dire, quand je clique sur chaque bouton, cela affecte uniquement ce bouton, au lieu de tous les boutons.
zx1986

Réponses:

436

Comment utiliser le conditionnel dans la classe ng:

Solution 1:

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

Solution 2:

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

Solution 3 (angulaire v.1.1.4 + prise en charge introduite pour l'opérateur ternaire):

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

Plunker

Stewie
la source
3
Le deuxième exemple est plus propre, mais il est ridicule que vous ne puissiez pas mettre la variable que vous évaluez au début de l'expression ... ça se lit juste drôle. Imaginez que vous considérez l'expression comme une instruction if: "if (variable) true: faites ceci, false: faites cela ... ugh #fullynerdy
mattdlockyer
10
@Stewie Faaakin magnifique mate, j'aime à quoi ça ressemble du vrai code et pas un balisage d'expression
bâtard
En fait, l'évaluation de la valeur en premier est très utile car elle évite d'attribuer accidentellement une nouvelle valeur à la variable.
lharby
Ternary est exactement ce que je cherchais. Bon travail fournissant trois exemples avec les détails de support de version.
TaeKwonJoe
13

Comme solution alternative, basée sur l'opérateur logique javascript '&&' qui retourne la dernière évaluation, vous pouvez également le faire comme ceci:

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

C'est une syntaxe légèrement plus courte, mais pour moi plus facile à lire.

Lukus
la source
10

Ajoutez plusieurs classes en fonction de la condition:

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

Appliquer: classe1 + classe2 + classe3 lorsque isNew = false ,

Appliquer: classe1 + classe4 lorsque isNew = true

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

Analogue à la toggleClassméthode de jQuery , c'est un moyen d'activer active/ désactiver la classe lorsque l'utilisateur clique sur l'élément.

Pavel Levin
la source
2
Pourriez-vous fournir plus d'informations sur votre réponse en anglais? En quoi est-ce différent des réponses qui sont déjà là?
Onots
2
Je ne sais pas pourquoi cette réponse a de nombreux votes négatifs ?? C'est la solution qui a vraiment mieux fonctionné pour moi que les autres ci-dessus ...
Paulo Griiettner
2
Je pense que la description est mal écrite et les gens réagissent au mot "jQuery". Ce que la description est censée dire est "Ceci est analogue à la fonction toggleClass dans JQuery". BTW, avez-vous besoin d'initier la variable?
Design par Adrian
1

le défilement automatique sera défini et modifié dans le contrôleur.

<span ng-class= "autoscroll?'class_if_true':'class_if_false'"></span>

Ajoutez plusieurs classes en fonction de la condition en:

<span ng-class= "autoscroll?'first second third':'classes_if_false'"></span>

Pantalon Harshit
la source
-1

J'ai fait ce travail de cette façon:

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

// dans votre contrôleur

 $scope.toggleClass = function (event){
        $(event.target).toggleClass('active');
    }
Ruhul Amin
la source
2
Bien que cela fonctionne, vous mélangez angular et jQuery. Vous devriez essayer d'éviter cela si vous le pouvez. Ce qui a été demandé à l'origine peut être fait sans événement de clic. Et si vous avez un autre bouton qui est censé basculer cette classe sur votre bouton ci-dessus? Il ne sera pas mis à jour maintenant car vous le modifiez au clic et non via ng-class
Ronnie
1
C'est de jqLite. Pour plus de docs.angularjs.org/api/ng/function/angular.element
Ruhul Amin
1
Je comprends. Mon point est que vous n'avez pas besoin d'utiliser quoi que ce soit jQuery pour obtenir la réponse à la question d'origine.
Ronnie