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'


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


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.


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


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.


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>


-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');
    }

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
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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.