AngularJS-Umschaltklasse mit ng-Klasse

217

Ich versuche, die Klasse eines Elements mit umzuschalten 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;
}

Grundsätzlich, wenn $scope.autoScrolles wahr ist, möchte ich, dass ng-class ist, icon-autoscrollund wenn es falsch ist, möchte ich, dass es so isticon-autoscroll-disabled

Was ich jetzt habe, funktioniert nicht und erzeugt diesen Fehler in der Konsole

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

Wie mache ich das richtig?

BEARBEITEN

Lösung 1: (veraltet)

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

BEARBEITEN 2

Lösung 2:

Ich wollte die Lösung aktualisieren, da Solution 3sie von Stewie bereitgestellt werden sollte. Es ist der Standard, wenn es um ternäre Operatoren geht (und für mich am einfachsten zu lesen). Die Lösung wäre

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

wird übersetzt in:

if (autoScroll == true) ?// benutze Klasse 'icon-autoscroll' :// sonst benutze'icon-autoscroll-disabled'

Ronnie
quelle
kann keine Bedingungen in angular expressionsper docs verwenden => Keine Kontrollflussanweisungen: Sie können im Winkelausdruck keine der folgenden Aktionen ausführen: Bedingungen, Schleifen oder Wurf. Verwenden Sie eine andere Funktion oder Anweisung
charlietfl
@ Ronnie Ich habe deine Lösung gesehen und es war so cool. aber ich frage mich, warum das autoScrollhier nur in jedem Knopf wirkt? (Ich habe dies mit mehreren Schaltflächen getestet und es funktioniert auch gut.) Ich meine, wenn ich auf jede Schaltfläche klicke, wirkt sich dies nur auf diese Schaltfläche aus, anstatt auf alle Schaltflächen.
zx1986

Antworten:

436

Verwendung der Bedingung in der ng-Klasse:

Lösung 1:

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

Lösung 2:

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

Lösung 3 (Winkel v.1.1.4 + Einführung der Unterstützung für den ternären Operator):

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

Plunker

Stewie
quelle
3
Das zweite Beispiel ist sauberer, aber es ist lächerlich, dass Sie die Variable, die Sie auswerten, nicht an die Spitze des Ausdrucks setzen können ... es liest sich nur lustig. Stellen Sie sich vor, Sie betrachten den Ausdruck als if-Anweisung: "if (variable) true: tun Sie dies, false: tun Sie das ... ugh #fullynerdy
mattdlockyer
10
@Stewie Faaakin wunderschöne Kumpel, liebe, wie es aussieht wie echter Code und nicht irgendein bastardisierter Ausdruck Markup: D
Mattdlockyer
Die tatsächliche Auswertung des Werts ist sehr nützlich, da dadurch vermieden wird, dass der Variablen versehentlich ein neuer Wert zugewiesen wird.
lharby
Ternary ist genau das, wonach ich gesucht habe. Gute Arbeit mit drei Beispielen mit Details zur Versionsunterstützung.
TaeKwonJoe
13

Als alternative Lösung, basierend auf dem Javascript-Logikoperator '&&', der die letzte Auswertung zurückgibt, können Sie dies auch folgendermaßen tun:

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

Es ist nur eine etwas kürzere Syntax, aber für mich leichter zu lesen.

Lukus
quelle
10

Fügen Sie basierend auf der Bedingung mehr als eine Klasse hinzu:

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

Anwenden: Klasse1 + Klasse2 + Klasse3, wenn isNew = false ,

Übernehmen: class1 + class4 wenn isNew = true

RolandoCC
quelle
6
<div data-ng-init="featureClass=false" 
     data-ng-click="featureClass=!featureClass" 
     data-ng-class="{'active': featureClass}">
    Click me to toggle my class!
</div>

Analog zur toggleClassMethode von jQuery können Sie auf diese Weise die activeKlasse ein- und ausschalten, wenn Sie auf das Element klicken.

Pavel Levin
quelle
2
Könnten Sie weitere Informationen zu Ihrer Antwort auf Englisch bereitstellen? Wie unterscheidet es sich von den Antworten, die bereits hier sind?
Onots
2
Ich bin nicht sicher, warum diese Antwort viele negative Stimmen hat? Dies ist die Lösung, die für mich tatsächlich besser funktioniert hat als die anderen oben ...
Paulo Griiettner
2
Ich denke, die Beschreibung ist schlecht geschrieben und die Leute reagieren auf das Wort "jQuery". Die Beschreibung soll sagen: "Dies ist analog zur Funktion toggleClass in JQuery". Übrigens, müssen Sie die Variable initialisieren?
Entwurf durch Adrian
1

Autoscroll wird in der Steuerung definiert und geändert.

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

Fügen Sie mehrere Klassen basierend auf der Bedingung hinzu, indem Sie:

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

Harshit Pant
quelle
-1

Ich habe diese Arbeit folgendermaßen gemacht:

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

// in deinem Controller

 $scope.toggleClass = function (event){
        $(event.target).toggleClass('active');
    }
Ruhul Amin
quelle
2
Während das funktioniert, mischen Sie Angular und jQuery. Sie sollten versuchen, dies zu vermeiden, wenn Sie können. Was ursprünglich gefragt wurde, kann ohne ein Klickereignis durchgeführt werden. Was ist, wenn Sie eine andere Schaltfläche haben, die diese Klasse auf Ihrer Schaltfläche oben umschalten soll? Es wird jetzt nicht aktualisiert, da Sie es beim Klicken und nicht durch ng-class ändern
Ronnie
1
Es ist von jqLite. Für mehr docs.angularjs.org/api/ng/function/angular.element
Ruhul Amin
1
Ich verstehe. Mein Punkt ist, dass Sie jQuery nicht verwenden müssen, um die Antwort auf die ursprüngliche Frage zu erhalten.
Ronnie