AngularJS ngClass condizionale


499

C'è un modo per esprimere un'espressione per qualcosa come ng-classessere condizionato?

Ad esempio, ho provato quanto segue:

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

Il problema con questo codice è che, indipendentemente da ciò che obj.value1è, il test di classe viene sempre applicato all'elemento. Facendo questo:

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

Finché obj.value2non equivale a un valore di verità, la classe non viene applicata. Ora posso aggirare il problema nel primo esempio facendo questo:

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

Dove la checkValue1funzione è simile a questa:

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

Mi chiedo solo se è così che ng-classdovrebbe funzionare. Sto anche costruendo una direttiva personalizzata in cui vorrei fare qualcosa di simile a questo. Tuttavia, non riesco a trovare un modo per guardare un'espressione (e forse è impossibile e il motivo per cui funziona così).

Ecco un plnkr per mostrare cosa intendo.


Date un'occhiata a questa risposta: stackoverflow.com/questions/14788652/...
Adrian Neatu

43
Le classi con trattini devono essere citate:ng-class="'label-success': obj.value1 == 'Ready', 'label-warning': obj.value1 == 'On hold'}"
Brent Washburne,

2
Possiamo usare più condizioni con ng-class, vedi su questo blog goo.gl/qfEQZw
virender


"Le classi con trattini hanno bisogno di ciglia '' '' '' '"
richard

Risposte:


596

Il tuo primo tentativo è stato quasi giusto, dovrebbe funzionare senza virgolette.

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

Ecco un plnkr .

La direttiva ngClass funzionerà con qualsiasi espressione che valuti verità o falsità, un po 'simile alle espressioni Javascript ma con alcune differenze, puoi leggere qui . Se il tuo condizionale è troppo complesso, puoi usare una funzione che restituisce verità o falsità, come hai fatto nel tuo terzo tentativo.

Solo per completare: è anche possibile utilizzare operatori logici per formare espressioni logiche come

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

2
Grazie, per qualsiasi motivo, ho pensato che dato che questa era un'espressione come valore dell'oggetto, l'intera cosa doveva essere racchiusa tra virgolette.
Ryanzec,

8
racchiudere il nome della classe in 'caso contrario, se si desidera aggiungere più classi o se la classe ha trattini o caratteri di sottolineatura, non funzionerà. ng-class="{'test test-2: obj.value1 === 'value'}"
Andrea Turri,

6
@Andrea, hai dimenticato la citazione di chiusura: ng-class="{'test test-2': obj.value1 === 'value'}"
ErikE

Per Angular2 (che stavo cercando di trovare) attributo uso (s) come: [class.test]="obj.value1 == 'someotervalue'".
kub1x,

Cordiali saluti ai lettori, puoi anche avere parentesi. ng-class="{danger:!enabled || (type === 'WHEEL' && !isOnline) }
daCoda,

227

Usando la classe ng all'interno di 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>

Per ogni stato in task.status viene utilizzata una classe diversa per la riga.


Esempio perfetto con più classi, grazie!
Sreekanth Karini,

112

JS angolare fornisce questa funzionalità nella Direttiva di classe ng . In cui è possibile inserire la condizione e anche assegnare una classe condizionale. Puoi raggiungerlo in due modi diversi.

Tipo 1

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

In questo codice di classe sarà applicabile in base al valore di status di valore

se il valore dello stato è 0, applicare la classe 1

se il valore dello stato è 1, applicare la classe due

se il valore dello stato è 2, applicare la classe tre


Tipo 2

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

In quale classe verrà applicato per valore di stato

se il valore dello stato è 1 o true , verrà aggiunta la classe test_yes

se il valore dello stato è 0 o falso , verrà aggiunta la classe test_no


1
qual è lo stato qui?
CommonSenseCode

Lo stato è il valore che si desidera verificare o convalidare in base alla classe da applicare.
Kaushal Khamar,

4
In questo modo è più flessibile e meno folle quando si ha a che fare con più valori
Eduardo La Hoz Miranda,

Che ne dici di usarlo per più classi. Ad esempio, <div ng-class = "{0: 'one', 1: 'two', 2: 'three'} [status], {0: 'one', 1: 'two'} [status1]"> </div>
parth.hirpara,

1
possiamo usare questo in un caso come: <div ng-class="{'Image' || 'image': 'image-icon', 'Video' || 'video' || 'aVideo' || 'bVideo' : 'video-icon'}[resource.type]"></div>
Chandra Kant Paliwal il

80

Vedo grandi esempi sopra ma iniziano tutti con parentesi graffe (json map). Un'altra opzione è quella di restituire un risultato basato sul calcolo. Il risultato può anche essere un elenco di nomi di classi CSS (non solo mappa). Esempio:

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

o

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

Spiegazione: Se lo stato è attivo, enabledverrà utilizzata la classe . Altrimenti, disabledverrà utilizzata la classe .

L'elenco []viene utilizzato per l'utilizzo di più classi (non solo una).


1
Esempi adorabili, tutti sorprendenti, ma mi piacciono di più i tuoi!
stormec56,

48

Esiste un metodo semplice che è possibile utilizzare con l'attributo html class e la scorciatoia se / else. Non c'è bisogno di renderlo così complesso. Usa solo il seguente metodo.

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

Buona programmazione, Nimantha Perera


2
Questo ragazzo lo capisce. Grazie gemma
deepakgates,

36

Ti mostrerò due metodi con cui puoi applicare dinamicamente ng-class

Passo 1

Usando l'operatore ternario

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

Produzione

Se la tua condizione è vera, allora class1 verrà applicato al tuo elemento, altrimenti verrà applicata class2.

Svantaggio

Quando proverai a modificare il valore condizionale in fase di esecuzione, la classe in qualche modo non verrà modificata. Quindi ti suggerirò di andare al passaggio 2 se hai requisiti come il cambio dinamico della classe.

Passo 2

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

Produzione

se la tua condizione corrisponde a value1, allora class1 verrà applicato al tuo elemento, se corrisponde a value2, allora verrà applicato class2 e così via. E il cambio di classe dinamico funzionerà bene con esso.

Spero che questo ti possa aiutare.


36

La sintassi angolare consiste nell'utilizzare l' operatore : per eseguire l'equivalente di un modificatore if

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

Aggiungi la classe clearfix alle righe pari. Tuttavia, l'espressione potrebbe essere tutto ciò che possiamo avere in condizioni normali e dovrebbe valutare vero o falso.


1
Bello! Inoltre, all'interno di ng-repeat puoi usare $ anche per impostare la classe. Ad esempio ng-class = "$ even? 'Even': 'odd'". Altri bool eleganti all'interno di ng-repeat sono $ first, $ last, $ even, $ odd ...
Max

15

L'uso della funzione con ng-class è una buona opzione quando qualcuno deve eseguire una logica complessa per decidere la classe CSS appropriata.

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
Penso che questo mescoli le preoccupazioni. Un controller dovrebbe essere più astratto e non preoccuparsi delle classi css, ma piuttosto dello stato. In base allo stato, le classi CSS devono essere applicate nel modello. In questo modo il controller è indipendente dal modello e riutilizzabile più facilmente.
Hubert Grzeskowiak,

9

Usa questo

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

ad esempio se la condizione è [2 == 2], gli stati sono {true: '...', false: '...'}

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

ma se avessi 3 o più condizioni, questo non funzionerebbe? poiché ciò restituirà solo le condizioni vere e false
Ali Al Amine,

condizioni significa vero o falso. Intendi qualcosa con più di 2 valori ?? @AlyAlAmeen
Saeed,

7

Per Angular 2, utilizzare questo

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

Per espandere questo, per Angular 2 applichi una classe e anche un modificatore di classe in un condizionale if / else usando un array come questo:[ngClass]="['base-class', thread.isActive ? 'base-class--active' : '']"
Matt Rabe

5

ng-classè una direttiva dei principali AngularJs. In cui è possibile utilizzare "Sintassi stringa", "Sintassi array", "Espressione valutata", "Operatore ternario" e molte altre opzioni descritte di seguito:

ngClass usando la sintassi delle stringhe

Questo è il modo più semplice di usare ngClass. Puoi semplicemente aggiungere una variabile angolare a ng-class e questa è la classe che verrà utilizzata per quell'elemento.

<!-- 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!

Demo Esempio di ngClass usando la sintassi delle stringhe

ngClass utilizzando la sintassi dell'array

Questo è simile al metodo di sintassi della stringa, tranne per il fatto che è possibile applicare più classi.

<!-- 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 utilizzando l'espressione valutata

Un metodo più avanzato di utilizzo di ngClass (e quello che probabilmente userete di più) è valutare un'espressione. Il modo in cui funziona è che se una variabile o espressione valuta true, è possibile applicare una determinata classe. In caso contrario, la classe non verrà applicata.

<!-- 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 }">

Esempio di ngClass utilizzando l'espressione valutata

ngClass utilizzando il valore

Questo è simile al metodo dell'espressione valutata, tranne per il fatto che sei in grado di confrontare più valori con l'unica variabile.

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

ngClass utilizzando l'operatore ternario

L'operatore ternario ci consente di usare la scorciatoia per specificare due diverse classi, una se un'espressione è vera e una per falso. Ecco la sintassi di base per l'operatore ternario:

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

Valutazione del primo, ultimo o numero specifico

Se si utilizza la ngRepeatdirettiva e si desidera applicare le classi al first, lasto un numero specifico nella lista, è possibile utilizzare le proprietà speciali di ngRepeat. Questi includono $first, $last, $even, $odd, e pochi altri. Ecco un esempio di come usarli.

<!-- 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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.