1203 Stimmen

Was ist der beste Weg, um bedingt eine Klasse anzuwenden?

Sagen wir, Sie haben ein Array, das in einem ul mit einem li für jedes Element und einer Eigenschaft auf dem Controller namens selectedIndex gerendert wird. Wie könnte man am besten eine Klasse zu dem li mit dem Index selectedIndex in AngularJS hinzufügen?

Derzeit dupliziere ich (manuell) den li-Code und füge die Klasse zu einem der li Tags hinzu und benutze ng-show und ng-hide, um nur ein li pro Index anzuzeigen.

2 Stimmen

Antworten auf diese Frage zeigen, dass das Templating mehr als {{varname}} umfasst. Wo finde ich Dokumentation darüber, was das Templating noch bietet, wie z.B. den ternären Operator in ein paar verschiedenen Formen? docs.angularjs.org/guide/templates scheint nicht zu erklären, was das Templating an Bedingungen usw. bietet, abgesehen von {{varname.fieldname}}.

0 Stimmen

Das ist für mich so nützlich, ich hoffe es funktioniert auch für dich tech-blog.maddyzone.com/javascript/…

1387voto

orcun Punkte 14959

Wenn Sie keine CSS-Klassennamen in den Controller einfügen möchten, wie ich es tue, hier ist ein alter Trick, den ich seit den Zeiten vor v1 verwende. Wir können einen Ausdruck schreiben, der direkt zu einem Klassenname selected ausgewertet wird, es sind keine benutzerdefinierten Direktiven erforderlich:

ng:class="{true:'selected', false:''}[$index==selectedIndex]"

Bitte beachten Sie die alte Syntax mit dem Doppelpunkt.

Es gibt auch eine bessere Möglichkeit, Klassen bedingt anzuwenden, wie zum Beispiel:

ng-class="{selected: $index==selectedIndex}"

Angular unterstützt jetzt Ausdrücke, die ein Objekt zurückgeben. Jede Eigenschaft (Name) dieses Objekts wird nun als Klassenname betrachtet und je nach ihrem Wert angewendet.

Allerdings sind diese Möglichkeiten nicht funktional gleich. Hier ist ein Beispiel:

ng-class="{admin:'enabled', moderator:'disabled', '':'hidden'}[user.role]"

Wir könnten daher vorhandene CSS-Klassen wiederverwenden, indem wir ein Modellattribut auf einen Klassennamen abbilden und gleichzeitig CSS-Klassen aus dem Controller-Code heraus halten.

0 Stimmen

Dies entfernt die alte Klasse nicht in v0.10, aber es scheint in v0.9.x zu funktionieren

0 Stimmen

@respectTheCode Hmm, ich hatte noch nicht die Gelegenheit, v0.10 zu testen. Hast du ein Problem gemeldet?

33 Stimmen

OP, das könnte die schlechteste Art sein, den ternären Operator auszudrücken, die ich je gesehen habe. Haben Sie schon ($index==selectedIndex) ? 'selected' : '' in Betracht gezogen?

438voto

Mark Rajcok Punkte 356006

ng-class unterstützt einen Ausdruck, der entweder zu Folgendem ausgewertet werden muss:

  1. Eine Zeichenkette aus Leerzeichen-getrennten Klassenbezeichnungen oder
  2. Ein Array von Klassenbezeichnungen oder
  3. Eine Abbildung/Objekt von Klassenbezeichnungen zu booleschen Werten.

So können wir mithilfe von Form 3) einfach schreiben

ng-class="{'selected': $index==selectedIndex}"

Siehe auch Wie wende ich bedingt CSS-Stile in AngularJS an? für eine umfassendere Antwort.


Update: Angular 1.1.5 hat Unterstützung für einen Ternäroperator hinzugefügt, also wenn Ihnen diese Konstruktion vertrauter ist:

ng-class="($index==selectedIndex) ? 'selected' : ''"

2 Stimmen

+1 für ternäre Operatoren (und ich brauche gerade einen) aber 1.1.* ist eine "unstable release", bei der die API ohne Vorankündigung geändert werden kann - zum Zeitpunkt des Schreibens. 1.0.* ist stabil, also würde ich mich für ein Projekt, das nächste Woche für 6 Monate ausgerollt werden soll, damit wohler fühlen.

1 Stimmen

ng-class="{'selected': $index==selectedIndex}" funktioniert für mich.

158voto

skmvasu Punkte 3108

Mein bevorzugte Methode ist die Verwendung des Ternärausdrucks.

ng-class="Bedingung ? 'trueClass' : 'falseClass'"

Hinweis: Falls du eine ältere Version von Angular verwendest, solltest du stattdessen dies verwenden:

ng-class="Bedingung && 'trueClass' || 'falseClass'"

2 Stimmen

Dies hat mir beim Verfassen dieses Ausdrucks geholfen: ng-class="property.name=='timestamp' ? 'property-timestamp' : 'property-'+{{$index}}". Konnte keine andere Möglichkeit finden.

0 Stimmen

Ich finde wirklich nicht heraus, warum mein begrenztes boolesches modalFlag nicht aktualisiert wird - `ng-class="{'closed': modalFlag , 'open':!modalFlag}"`. Ich versuche entweder closed oder open hinzuzufügen, abhängig von der begrenzten Variablen/boolean - wenn jemand helfen kann, wäre ich sehr dankbar - danke.

0 Stimmen

Dies wurde als Version 1.5 eingeführt. github.com/angular/angular.js/commit/…

53voto

stefano Punkte 3492

Ich werde das ergänzen, weil einige dieser Antworten veraltet zu sein scheinen. So mache ich es:

Wo "isSelected" eine im umschlossenen Angular-Controller definierte JavaScript-Variable ist.

Um Ihre Frage genauer zu beantworten, hier ist, wie Sie eine Liste damit generieren könnten:

HTML

       {{item.name}}

JS

function ListCtrl($scope) {    
    $scope.list = [  
        {"name": "Punkt 1", "isSelected": "aktiv"},  
        {"name": "Punkt 2", "isSelected": ""}
    ]
}

Siehe: http://jsfiddle.net/tTfWM/

Siehe: http://docs.angularjs.org/api/ng.directive:ngClass

0 Stimmen

Was ist der Unterschied zwischen class="ng-class:item.isSelected" und ng-class="item.isSelected"

0 Stimmen

Neugierig auf die Verwendung von ng-class:className vs. einfach nur class="{{className}}"?

48voto

Hier ist eine viel einfachere Lösung:

function MyControl($scope){
    $scope.values = ["a","b","c","d","e","f"];
    $scope.selectedIndex = -1;

    $scope.toggleSelect = function(ind){
        if( ind === $scope.selectedIndex ){
            $scope.selectedIndex = -1;
        } else{
            $scope.selectedIndex = ind;
        }
    }

    $scope.getClass = function(ind){
        if( ind === $scope.selectedIndex ){
            return "selected";
        } else{
            return "";
        }
    }

    $scope.getButtonLabel = function(ind){
        if( ind === $scope.selectedIndex ){
            return "Abwählen";
        } else{
            return "Auswählen";
        }
    }
}

.selected {
    color:red;
}

        {{value}} {{getButtonLabel($index)}}

    Ausgewählt: {{selectedIndex}}

74 Stimmen

Ich würde dringend empfehlen, Ihren Controller frei von CSS-Sachen zu halten. Das ist ein Weg, den Sie nicht beschreiten möchten.

1 Stimmen

Klassennamen gehören in die Vorlage

5 Stimmen

Zu einem bestimmten Zeitpunkt könnte es passieren, dass jsfiddle ihre Rechnungen nicht bezahlt, oder sich dafür entscheiden, auf eine andere Domain umzuziehen, oder die verantwortlichen Personen von einem Bus überfahren werden (siehe auch Bus Factor). Darf ich dich also bitten, zu erklären, was diese `"Fiddle"` innerhalb deiner Antwort macht? Das ist auch auf stack overflow kanonisch.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X