AngularJS attiva / disattiva la classe usando ng-class


217

Sto cercando di attivare / disattivare la classe di un elemento 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;
}

Fondamentalmente, se $scope.autoScrollè vero, voglio che ng-class sia icon-autoscrolle se è falso, voglio che siaicon-autoscroll-disabled

Quello che ho ora non funziona e sta producendo questo errore nella console

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

Come posso farlo correttamente?

MODIFICARE

soluzione 1: (obsoleto)

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

MODIFICA 2

soluzione 2:

Volevo aggiornare la soluzione come Solution 3, fornita da Stewie, dovrebbe essere quella utilizzata. È il più standard quando si tratta di operatore ternario (e per me più facile da leggere). La soluzione sarebbe

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

si traduce in:

if (autoScroll == true) ?// use class 'icon-autoscroll' :// else use'icon-autoscroll-disabled'


non è possibile utilizzare i condizionali in angular expressionsper docs => Nessuna dichiarazione del flusso di controllo: non è possibile eseguire alcuna delle seguenti operazioni in espressione angolare: condizionali, loop o lancio. Utilizzare un'altra funzione o direttiva
charlietfl

@Ronnie ho visto la tua soluzione ed è stato fantastico. ma mi chiedo perché il autoScrollqui avrà effetto in ogni pulsante? (L'ho provato con più pulsanti e funziona anche bene) Voglio dire, quando faccio clic su ciascun pulsante, ha effetto solo su quel pulsante, anziché su tutti i pulsanti.
zx1986,

Risposte:


436

Come usare il condizionale in ng-class:

Soluzione 1:

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

Soluzione 2:

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

Soluzione 3 (angolare v.1.1.4 + supporto introdotto per operatore ternario):

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

Plunker


3
Il secondo esempio è più pulito, ma è ridicolo che non puoi mettere la variabile che stai valutando all'inizio dell'espressione ... sembra solo divertente. Immagina di guardare l'espressione come un'istruzione if: "if (variabile) vero: fai questo, falso: fallo ... ugh #fullynerdy
mattdlockyer

10
@Stewie Faaakin splendida compagna, adoro come sembra un vero codice e non un markup di espressioni bastardate: D
mattdlockyer

La prima valutazione del valore è piuttosto utile in quanto evita di assegnare accidentalmente un nuovo valore alla variabile.
Lharby,

Ternary è esattamente quello che stavo cercando. Ottimo lavoro fornendo tre esempi con i dettagli di supporto della versione.
TaeKwonJoe,

13

Come soluzione alternativa, basata sull'operatore di logica javascript '&&' che restituisce l'ultima valutazione, è anche possibile farlo in questo modo:

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

È solo una sintassi leggermente più breve, ma per me più facile da leggere.


10

Aggiungi più di una classe in base alla condizione:

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

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

Applica: class1 + class4 quando 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>

Analogamente al toggleClassmetodo di jQuery , questo è un modo per attivare active/ disattivare la classe quando si fa clic sull'elemento.


2
Potresti fornire qualche informazione in più sulla tua risposta in inglese? In che cosa differisce dalle risposte che sono già qui?
Onots,

2
Non sono sicuro del perché questa risposta abbia molti voti negativi ?? Questa è la soluzione che in realtà ha funzionato meglio per me rispetto agli altri sopra ...
Paulo Griiettner

2
Penso che la descrizione sia scritta male e la gente reagisca alla parola "jQuery". Ciò che la descrizione vuole dire è "Questo è analogo alla funzione toggleClass in JQuery". A proposito, devi avviare la variabile?
Design di Adrian,

1

lo scorrimento automatico verrà definito e modificato nel controller.

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

Aggiungi più classi in base alla condizione di:

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


-1

Ho fatto questo lavoro in questo modo:

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

// nel tuo controller

 $scope.toggleClass = function (event){
        $(event.target).toggleClass('active');
    }

2
Mentre funziona, stai mescolando angolare e jQuery. Dovresti cercare di evitarlo se puoi. Ciò che è stato inizialmente richiesto può essere eseguito senza un evento clic. E se hai un altro pulsante che dovrebbe attivare questa classe sul tuo pulsante sopra? Non si aggiorna ora perché lo stai modificando con un clic e non tramite ng-class
Ronnie l'


1
Capisco. Il punto è che non è necessario utilizzare jQuery per ottenere la risposta alla domanda originale.
Ronnie,
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.