AngularJS ngClass conditionnel


499

Existe-t-il un moyen de faire une expression pour quelque chose comme ng-classêtre un conditionnel?

Par exemple, j'ai essayé ce qui suit:

<span ng-class="{test: 'obj.value1 == \'someothervalue\''}">test</span>

Le problème avec ce code est que, quoi qu'il en obj.value1soit, le test de classe est toujours appliqué à l'élément. Ce faisant:

<span ng-class="{test: obj.value2}">test</span>

Tant que obj.value2ne correspond pas à une valeur véridique, la classe n'est pas appliquée. Maintenant, je peux contourner le problème dans le premier exemple en procédant comme suit:

<span ng-class="{test: checkValue1()}">test</span>

Où la checkValue1fonction ressemble à ceci:

$scope.checkValue1 = function() {
  return $scope.obj.value === 'somevalue';
}

Je me demande simplement si c'est ainsi que cela ng-classest censé fonctionner. Je construis également une directive personnalisée dans laquelle j'aimerais faire quelque chose de similaire à cela. Cependant, je ne peux pas trouver un moyen de regarder une expression (et c'est peut-être impossible et la raison pour laquelle cela fonctionne comme ça).

Voici un plnkr pour montrer ce que je veux dire.


Jetez un œil à cette réponse: stackoverflow.com/questions/14788652/…
Adrian Neatu

43
Les classes avec des tirets doivent être citées:ng-class="'label-success': obj.value1 == 'Ready', 'label-warning': obj.value1 == 'On hold'}"
Brent Washburne

2
Nous pouvons utiliser plus de conditions avec ng-class, voir sur ce blog goo.gl/qfEQZw
virender


"Les classes avec des tirets ont besoin de coups de fouet '' '' '' '"
richard

Réponses:


596

Votre première tentative était presque juste, cela devrait fonctionner sans les guillemets.

{test: obj.value1 == 'someothervalue'}

Voici un plnkr .

La directive ngClass fonctionnera avec n'importe quelle expression qui évalue véridique ou falsey, un peu similaire aux expressions Javascript mais avec quelques différences, vous pouvez lire ici . Si votre conditionnel est trop complexe, vous pouvez utiliser une fonction qui retourne true ou falsey, comme vous l'avez fait lors de votre troisième tentative.

Juste pour compléter: vous pouvez également utiliser des opérateurs logiques pour former des expressions logiques comme

ng-class="{'test': obj.value1 == 'someothervalue' || obj.value2 == 'somethingelse'}"

2
Merci, pour une raison quelconque, je pensais que parce que c'était une expression comme valeur de l'objet, le tout devait être entre guillemets.
ryanzec

8
encapsulez le nom de la classe avec 'sinon si vous souhaitez ajouter plus de classes ou si votre classe a des tirets ou des traits de soulignement, cela ne fonctionnera pas. ng-class="{'test test-2: obj.value1 === 'value'}"
Andrea Turri

6
@Andrea, vous avez oublié la citation de clôture: ng-class="{'test test-2': obj.value1 === 'value'}"
ErikE

Pour Angular2 (que je cherchais à trouver) attribut utilisation (s) comme: [class.test]="obj.value1 == 'someotervalue'".
kub1x

Pour info aux lecteurs, vous pouvez aussi avoir des parenthèses. ng-class="{danger:!enabled || (type === 'WHEEL' && !isOnline) }
daCoda

227

Utilisation de ng-class dans ng-repeat

<table>
    <tbody>
            <tr ng-repeat="task in todos"
                ng-class="{'warning': task.status == 'Hold' , 'success': task.status == 'Completed',
              'active': task.status == 'Started', 'danger': task.status == 'Pending' } ">
                <td>{{$index + 1}}</td>
                <td>{{task.name}}</td>
                <td>{{task.date|date:'yyyy-MM-dd'}}</td>
                <td>{{task.status}}</td>
            </tr>
    </tbody>
</table>

Pour chaque état dans task.status, une classe différente est utilisée pour la ligne.


Exemple parfait avec plusieurs classes, merci!
Sreekanth Karini

112

Angular JS fournit cette fonctionnalité dans la directive ng-class . Dans lequel vous pouvez mettre une condition et également affecter une classe conditionnelle. Vous pouvez y parvenir de deux manières différentes.

Type 1

<div ng-class="{0:'one', 1:'two',2:'three'}[status]"></div>

Dans cette classe , le code sera applicable en fonction de la valeur de l' état valeur

si la valeur d' état est 0, appliquer la classe 1

si la valeur d' état est 1, appliquer la classe deux

si la valeur d' état est 2, appliquer la classe trois


Type 2

<div ng-class="{1:'test_yes', 0:'test_no'}[status]"></div>

Dans quelle classe sera appliqué par valeur de statut

si la valeur d' état est 1 ou vraie, alors il ajoutera la classe test_yes

si la valeur de l' état est 0 ou fausse, cela ajoutera la classe test_no


1
quel est le statut ici?
CommonSenseCode du

Le statut est une valeur que vous souhaitez vérifier ou valider en fonction de la classe qui sera appliquée.
Kaushal Khamar

4
Comme ça, car il est plus flexible et moins fou quand il s'agit de valeurs multiples
Eduardo La Hoz Miranda

Que diriez-vous de l'utiliser pour plusieurs classes. Comme, <div ng-class = "{0: 'un', 1: 'deux', 2: 'trois'} [état], {0: 'un', 1: 'deux'} [état1]"> </div>
parth.hirpara

1
pouvons-nous l'utiliser dans un tel cas comme: <div ng-class="{'Image' || 'image': 'image-icon', 'Video' || 'video' || 'aVideo' || 'bVideo' : 'video-icon'}[resource.type]"></div>
Chandra Kant Paliwal

80

Je vois de grands exemples ci-dessus mais ils commencent tous par des accolades (carte json). Une autre option consiste à renvoyer un résultat basé sur le calcul. Le résultat peut également être une liste de noms de classes css (pas seulement une carte). Exemple:

ng-class="(status=='active') ? 'enabled' : 'disabled'"

ou

ng-class="(status=='active') ? ['enabled'] : ['disabled', 'alik']"

Explication: Si le statut est actif, la classe enabledsera utilisée. Sinon, la classe disabledsera utilisée.

La liste []est utilisée pour utiliser plusieurs classes (pas une seule).


1
De beaux exemples, tous incroyables, mais j'aime le plus le vôtre!
stormec56

48

Il existe une méthode simple que vous pouvez utiliser avec l'attribut de classe html et le raccourci if / else. Pas besoin de le rendre si complexe. Utilisez simplement la méthode suivante.

<div class="{{expression == true ? 'class_if_expression_true' : 'class_if_expression_false' }}">Your Content</div>

Joyeux codage, Nimantha Perera


2
Ce gars comprend. Merci bud
deepakgates

36

Je vais vous montrer deux méthodes par lesquelles vous pouvez appliquer dynamiquement la classe ng

Étape 1

En utilisant l'opérateur ternaire

<div ng-class="condition?'class1':'class2'"></div>

Production

Si votre condition est vraie, alors class1 sera appliqué à votre élément, sinon class2 sera appliqué.

Désavantage

Lorsque vous essayez de modifier la valeur conditionnelle au moment de l'exécution, la classe ne change pas. Je vous propose donc de passer à l'étape 2 si vous avez des exigences telles que le changement de classe dynamique.

Étape 2

<div ng-class="{value1:'class1', value2:'class2'}[condition]"></div>

Production

si votre condition correspond à valeur1, alors classe1 sera appliquée à votre élément, si correspond à valeur2, alors classe2 sera appliquée et ainsi de suite. Et le changement de classe dynamique fonctionnera bien avec cela.

J'espère que cela vous aidera.


36

La syntaxe angulaire consiste à utiliser l' opérateur : pour effectuer l'équivalent d'un modificateur if

<div ng-class="{ 'clearfix' : (row % 2) == 0 }">

Ajoutez la classe clearfix aux lignes paires. Néanmoins, l'expression pourrait être tout ce que nous pouvons avoir dans un état normal et elle devrait être vraie ou fausse.


1
Agréable! De plus, à l'intérieur de ng-repeat, vous pouvez utiliser $ even pour définir la classe. Par exemple, ng-class = "$ even? 'Even': 'odd'". Les autres bools astucieux à l'intérieur de la répétition ng sont $ premier, $ dernier, $ pair, $ impair ...
Max

15

L'utilisation de la fonction avec ng-class est une bonne option lorsque quelqu'un doit exécuter une logique complexe pour décider de la classe CSS appropriée.

http://jsfiddle.net/ms403Ly8/2/

HTML:

<div ng-app>
  <div ng-controller="testCtrl">
        <div ng-class="getCSSClass()">Testing ng-class using function</div>       
    </div>
</div>

CSS:

.testclass { Background: lightBlue}

JavaScript :

function testCtrl($scope) {
    $scope.getCSSClass = function() {
     return "testclass ";
  }     
}

2
Je pense que cela confond les préoccupations. Un contrôleur devrait être plus abstrait et ne pas se soucier des classes CSS, mais plutôt de l'état. En fonction de l'état, les classes css doivent être appliquées dans le modèle. De cette façon, le contrôleur est indépendant du modèle et réutilisable plus facilement.
Hubert Grzeskowiak

9

utilisez ceci

<div ng-class="{states}[condition]"></div>

par exemple, si la condition est [2 == 2], les états sont {true: '...', false: '...'}

<div ng-class="{true: 'ClassA', false: 'ClassB'}[condition]"></div>

mais si j'ai 3 conditions ou plus, cela ne fonctionnerait pas? car cela ne retournera que des conditions vraies et fausses
Ali Al Amine

conditions signifie vrai ou faux. Vous voulez dire quelque chose avec plus de 2 valeurs ?? @AlyAlAmeen
Saeed

7

Pour Angular 2, utilisez ceci

<div [ngClass]="{'active': dashboardComponent.selected_menu == 'mapview'}">Content</div>

Pour développer cela, pour Angular 2, vous appliquez une classe et également un modificateur de classe dans un conditionnel if / else en utilisant un tableau comme celui-ci:[ngClass]="['base-class', thread.isActive ? 'base-class--active' : '']"
Matt Rabe

5

ng-classest une directive des AngularJ de base. Dans lequel vous pouvez utiliser "String Syntax", "Array Syntax", "Evaluated Expression", "Ternary Operator" et bien d'autres options décrites ci-dessous:

ngClass à l'aide de la syntaxe de chaîne

C'est la manière la plus simple d'utiliser ngClass. Vous pouvez simplement ajouter une variable angulaire à ng-class et c'est la classe qui sera utilisée pour cet élément.

<!-- whatever is typed into this input will be used as the class for the div below -->
<input type="text" ng-model="textType">

<!-- the class will be whatever is typed into the input box above -->
<div ng-class="textType">Look! I'm Words!

Exemple de démonstration de ngClass à l'aide de la syntaxe de chaîne

ngClass à l'aide de la syntaxe de tableau

Ceci est similaire à la méthode de syntaxe de chaîne, sauf que vous pouvez appliquer plusieurs classes.

<!-- both input boxes below will be classes for the div -->
<input type="text" ng-model="styleOne">
<input type="text" ng-model="styleTwo">

<!-- this div will take on both classes from above -->
<div ng-class="[styleOne, styleTwo]">Look! I'm Words!

ngClass utilisant l'expression évaluée

Une méthode plus avancée d'utilisation de ngClass (et celle que vous utiliserez probablement le plus) consiste à évaluer une expression. La façon dont cela fonctionne est que si une variable ou une expression est évaluée true, vous pouvez appliquer une certaine classe. Sinon, la classe ne sera pas appliquée.

<!-- input box to toggle a variable to true or false -->
<input type="checkbox" ng-model="awesome"> Are You Awesome?
<input type="checkbox" ng-model="giant"> Are You a Giant?

<!-- add the class 'text-success' if the variable 'awesome' is true -->
<div ng-class="{ 'text-success': awesome, 'text-large': giant }">

Exemple de ngClass utilisant l'expression évaluée

ngClass utilisant la valeur

Ceci est similaire à la méthode d'expression évaluée, sauf que vous pouvez simplement comparer plusieurs valeurs avec la seule variable.

<div ng-class="{value1:'class1', value2:'class2'}[condition]"></div>

ngClass à l'aide de l'opérateur ternaire

L'opérateur ternaire nous permet d'utiliser des raccourcis pour spécifier deux classes différentes, une si une expression est vraie et une pour faux. Voici la syntaxe de base de l'opérateur ternaire:

ng-class="$variableToEvaluate ? 'class-if-true' : 'class-if-false'">

Évaluation du premier, du dernier ou du numéro spécifique

Si vous utilisez la ngRepeatdirective et que vous souhaitez appliquer des classes au first, lastou un numéro spécifique dans la liste, vous pouvez utiliser les propriétés particulières de ngRepeat. Ceux - ci comprennent $first, $last, $even, $odd, et quelques autres. Voici un exemple d'utilisation.

<!-- add a class to the first item -->
<ul>
  <li ng-class="{ 'text-success': $first }" ng-repeat="item in items">{{ item.name }}</li>
</ul>

<!-- add a class to the last item -->
<ul>
  <li ng-class="{ 'text-danger': $last }" ng-repeat="item in items">{{ item.name }}</li>
</ul>

<!-- add a class to the even items and a different class to the odd items -->
<ul>
  <li ng-class="{ 'text-info': $even, 'text-danger': $odd }" ng-repeat="item in items">{{ item.name }}</li>
</ul>
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.