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'


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


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.


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


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.


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>


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

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
Rozumiem. Chodzi mi o to, że nie potrzebujesz niczego używać jQuery, aby uzyskać odpowiedź na pierwotne pytanie.
Ronnie,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.