AngularJS przełącza klasę za pomocą ng-class

217

Próbuję przełączać klasę elementu za pomocą 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;
}

Zasadniczo, jeśli $scope.autoScrolljest to prawdą, chcę, aby klasa ng była, icon-autoscrolla jeśli jest fałszywa, chcę, aby byłaicon-autoscroll-disabled

To, co mam teraz, nie działa i powoduje ten błąd w konsoli

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

Jak poprawnie to zrobić?

EDYTOWAĆ

rozwiązanie 1: (nieaktualne)

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

EDYCJA 2

rozwiązanie 2:

Chciałem zaktualizować rozwiązanie, ponieważ Solution 3dostarczone przez Stewie powinno być tym, którego użyłem. Jest to najbardziej standardowy jeśli chodzi o operatora trójskładnikowego (i dla mnie najłatwiejszy do odczytania). Rozwiązaniem byłoby

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

przetłumaczyć na:

if (autoScroll == true) ?// użyj klasy 'icon-autoscroll' :// else use'icon-autoscroll-disabled'

Ronnie
źródło
nie można używać warunkowych w angular expressionsdokumentach => Brak instrukcji przepływu sterowania: w wyrażeniu kątowym nie można wykonać żadnej z następujących czynności: warunkowe, pętle lub rzut. Użyj innej funkcji lub dyrektywy
charlietfl,
@Ronnie Widziałem twoje rozwiązanie i było bardzo fajne. ale zastanawiam się, dlaczego autoScrolltutaj zadziała tylko w każdym przycisku? (Przetestowałem to z wieloma przyciskami i to też działa dobrze) To znaczy, kiedy klikam każdy przycisk, działa tylko na ten przycisk, a nie na wszystkie przyciski.
zx1986

Odpowiedzi:

436

Jak używać warunkowej w klasie ng:

Rozwiązanie 1:

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

Rozwiązanie 2:

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

Rozwiązanie 3 (Angular v.1.1.4 + wprowadził obsługę operatora trójskładnikowego):

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

Plunker

Stewie
źródło
3
Drugi przykład jest czystszy, ale to śmieszne, że nie możesz umieścić zmiennej, którą oceniasz, na początku wyrażenia ... to po prostu śmieszne. Wyobraź sobie, że patrzysz na wyrażenie jak na instrukcję if: „if (zmienna) prawda: zrób to, fałsz: zrób to ... ugh #fullynerdy
mattdlockyer
10
@Stewie Faaakin, wspaniały kumplu, uwielbiam, jak to wygląda prawdziwy kod, a nie jakieś marne wyrażenia: D
mattdlockyer
Rzeczywista ocena wartości jako pierwsza jest całkiem przydatna, ponieważ pozwala uniknąć przypadkowego przypisania zmiennej nowej wartości.
lharby
Ternary jest dokładnie tym, czego szukałem. Dobra robota, podając trzy przykłady ze szczegółami obsługi wersji.
TaeKwonJoe
13

Jako alternatywne rozwiązanie oparte na operatorze logiki javascript „&&”, który zwraca ostatnią ocenę, możesz również zrobić to tak:

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

To tylko nieco krótsza składnia, ale dla mnie łatwiejsza do odczytania.

Lukus
źródło
10

Dodaj więcej niż jedną klasę na podstawie warunku:

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

Zastosuj: klasa 1 + klasa 2 + klasa 3, gdy isNew = false ,

Zastosuj: klasa 1 + klasa 4, gdy isNew = true

RolandoCC
źródło
6
<div data-ng-init="featureClass=false" 
     data-ng-click="featureClass=!featureClass" 
     data-ng-class="{'active': featureClass}">
    Click me to toggle my class!
</div>

Analogicznie do toggleClassmetody jQuery , jest to sposób na włączenie active/ wyłączenie klasy po kliknięciu elementu.

Pavel Levin
źródło
2
Czy możesz podać więcej informacji na temat swojej odpowiedzi w języku angielskim? Czym różni się od odpowiedzi, które już tu są?
Onots
2
Nie jestem pewien, dlaczego ta odpowiedź ma wiele negatywnych głosów? Jest to rozwiązanie, które faktycznie działało dla mnie lepiej niż inne powyżej ...
Paulo Griiettner
2
Myślę, że opis jest źle napisany i ludzie reagują na słowo „jQuery”. To, co ma oznaczać, to „To jest analogiczne do funkcji toggleClass w JQuery”. BTW, czy musisz zainicjować zmienną?
Projekt Adrian
1

automatyczne przewijanie zostanie zdefiniowane i zmodyfikowane w kontrolerze.

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

Dodaj wiele klas na podstawie warunku przez:

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

Harshit Pant
źródło
-1

Zrobiłem to w ten sposób:

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

// w twoim kontrolerze

 $scope.toggleClass = function (event){
        $(event.target).toggleClass('active');
    }
Ruhul Amin
źródło
2
Chociaż to działa, łączysz kątowe i jQuery. Powinieneś spróbować tego uniknąć, jeśli możesz. To, o co pierwotnie zapytano, można zrobić bez zdarzenia kliknięcia. Co jeśli masz inny przycisk, który ma przełączać tę klasę na przycisku powyżej? Nie zaktualizuje się teraz, ponieważ zmieniasz go po kliknięciu, a nie przez klasę ng
Ronnie,
1
Pochodzi z jqLite. Więcej docs.quarejs.org/api/ng/function/angular.element
Ruhul Amin
1
Rozumiem. Chodzi mi o to, że nie potrzebujesz niczego używać jQuery, aby uzyskać odpowiedź na pierwotne pytanie.
Ronnie,