Hinzufügen mehrerer Klassen mit ng-class


542

Können wir mehrere Ausdrücke haben, um mehrere ng-Klassen hinzuzufügen?

für zB.

<div ng-class="{class1: expressionData1, class2: expressionData2}"></div>

Wenn ja, kann jemand das Beispiel dafür aufstellen.

.


17
Ihr Beispiel funktioniert wie es ist.
Steve Klösters

Ja, ich musste nur! Important in CSS verwenden, um es sichtbar zu machen. Ich habe es selbst gefunden :)
Aditya Sethi

Was @stevuu gesagt hat .. ist ri8 ... Ihre Frage ist Antwort
YaswanthJg

Nimmt der Wert expressionData1 normalerweise true / false an oder einen tatsächlichen Zeichenfolgenwert?
Martian2049

Antworten:


978

So wenden Sie verschiedene Klassen an, wenn verschiedene Ausdrücke Folgendes ergeben true:

<div ng-class="{class1 : expression1, class2 : expression2}">
    Hello World!
</div>

So wenden Sie mehrere Klassen an, wenn ein Ausdruck wahr ist:

<!-- notice expression1 used twice -->
<div ng-class="{class1 : expression1, class2 : expression1}">
    Hello World!
</div>

oder ganz einfach:

<div ng-class="{'class1 class2' : expression1}">
    Hello World!
</div>

Beachten Sie die einfachen Anführungszeichen, die CSS-Klassen umgeben.


11
Sie können nicht mehrere Klassen wie ng-class = "{'class1 class2': expression1}" übergeben. Testen Sie dies einfach und haben Sie überhaupt nicht funktioniert. Lösung wie @CodeHater sagte: "Mehrere Klassen anwenden, wenn ein Ausdruck wahr ist:" der Trick
d1jhoni1b

9
In 1.2.16 'class1 class2': expressionscheint die Option für mehrere Klassen ( ) einwandfrei zu funktionieren, außer dass sie bei der Wiederverwendung einer Klasse gelöscht wird, wenn der Ausdruck zwischen den Optionen wechselt. ZB mit 'commonClass class1': expression == true, 'commonClass class2': expression == falsecommonClass geht verloren, wenn der Ausdruck zwischen wahr und falsch wechselt.
BrianS

10
@BrianS Ich würde so etwas tun:class="commonClass" ng-class={'class1' : expression, 'class2' : !expression}
AlwaysALearner

@ CodeHater danke. Das ist ziemlich genau das, was ich jetzt plane. Ich brauche nur einen Moment, um das CSS zu reparieren.
BrianS

Ist ng-class="{'class1' : expression1, 'class2':expression1 }"möglich Würde es Ihnen etwas
ausmachen,

48

Für die ternäre Operator-Notation:

<div ng-class="expression1? 'class1 class2' : 'class3 class4'">

Dieser funktioniert nicht für mich. <span ng-class = "params.isAdmin? 'fa fa-lock fa-2x': 'fa fa-lock fa-2x'"> </ span>. Die Konsole gibt einen Fehler aus.
TommyQu

Kann ich mit dieser Methode einen weiteren Ausdruck hinzufügen?
Wanderung Nalbandyan

6
@HikeNalbandyan Ja, Sie können auch einen anderen Ausdruck hinzufügen:ng-class="[expression1? 'class1 class2' : 'class3 class4', expression2 ? 'class5' : 'class6']"
Mahi-Man

47

Ja, Sie können mehrere Ausdrücke verwenden, um mehrere Klassen in der ng-Klasse hinzuzufügen.

Zum Beispiel:

<div ng-class="{class1:Result.length==2,class2:Result.length==3}"> Dummy Data </div>

45

Eine unglaublich mächtige Alternative zu anderen Antworten hier:

ng-class="[  { key: resulting-class-expression }[ key-matching-expression ], ..  ]"

Einige Beispiele:

1. Fügt einfach 'class1 class2 class3' zum div hinzu:

<div ng-class="[{true: 'class1'}[true], {true: 'class2 class3'}[true]]"></div>

2. Fügt div je nach $ index 'ungerade' oder 'gerade' Klassen hinzu:

<div ng-class="[{0:'even', 1:'odd'}[ $index % 2]]"></div>

3. Erstellt dynamisch eine Klasse für jedes Div basierend auf $ index

<div ng-class="[{true:'index'+$index}[true]]"></div>

Wenn $index=5dies zu folgenden Ergebnissen führt:

<div class="index5"></div>

Hier ist ein Codebeispiel, das Sie ausführen können:

var app = angular.module('app', []); 
app.controller('MyCtrl', function($scope){
  $scope.items = 'abcdefg'.split('');
}); 
.odd  { background-color: #eee; }
.even { background-color: #fff; }
.index5 {background-color: #0095ff; color: white; font-weight: bold; }
* { font-family: "Courier New", Courier, monospace; }
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular.min.js"></script>

<div ng-app="app" ng-controller="MyCtrl">
  <div ng-repeat="item in items"
    ng-class="[{true:'index'+$index}[true], {0:'even', 1:'odd'}[ $index % 2 ]]">
    index {{$index}} = "{{item}}" ng-class="{{[{true:'index'+$index}[true], {0:'even', 1:'odd'}[ $index % 2 ]].join(' ')}}"
  </div>
</div>


2
Geniale Antwort! Ich habe immer Funktionen für komplexere ng-classAnweisungen verwendet, z. B. wenn ich einen ternären und einen Standardausdruck auf dasselbe Element anwenden musste. Ich habe die akzeptierte Antwort bearbeitet, um die Verwendung von Arrays von Ausdrücken einzuschließen.
Daniel Bonnell

Ich bin kein Angular-Experte, aber es scheint, dass dieses Konstrukt: [{true:'index'+$index}[true], {0:'even', 1:'odd'}[ $index % 2 ]]so vereinfacht werden kann ['index'+$index, {0:'even', 1:'odd'}[ $index % 2 ]]. Ich habe es gerade in Angular 1.5.9 versucht und es funktioniert :) Danke für eine tolle Antwort!
Vadipp

30

Mithilfe einer $scopeMethode auf dem Controller können Sie berechnen, welche Klassen in der Ansicht ausgegeben werden sollen. Dies ist besonders praktisch, wenn Sie eine komplexe Logik zum Berechnen von Klassennamen haben und dadurch die Logikmenge in Ihrer Ansicht verringert wird, indem Sie sie auf den Controller verschieben:

app.controller('myController', function($scope) {

    $scope.className = function() {

        var className = 'initClass';

        if (condition1())
            className += ' class1';

        if (condition2())
            className += ' class2';

        return className;
    };
});

und in der Ansicht einfach:

<div ng-class="className()"></div>

1
Wenn sich die Klasse nach dem Rendern ändert, wartet ng-class immer noch auf Änderungen in className?
Remarsh

3
IMHO sollte der Bereich nur die Bedingung offenlegen . Es sollte an den HTML- ng-Bindungen liegen, zu bestimmen, welche Klasse verwendet werden soll, wenn diese Bedingung erfüllt ist.
Alnitak

1
Dadurch wird das Klassenattribut in dom-Elementen überschrieben. Wenn man dies verwendet, müssen sie die Klassen, die keine Bedingungen benötigen, in die Rückgabe aufnehmen className.
Phuwin

20

Ihr Beispiel funktioniert für konditionierte Klassen (der Klassenname zeigt an, ob der expressionDataXWert wahr ist):

<div ng-class="{class1: expressionData1, class2: expressionData2}"></div>

Sie können auch mehrere Klassen hinzufügen, die vom Benutzer des Elements bereitgestellt werden:

<div ng-class="[class1, class2]"></div>

Verwendungszweck:

<div class="foo bar" class1="foo" class2="bar"></div>


3
Wissen Sie, ob es möglich ist, die beiden Arten von Vorlagen zu kombinieren, dh eine bedingte Klasse mit {}und eine datengebundene Klasse mit []?
JWG

3
Soweit ich weiß ist das nicht möglich. Es ist auch nicht möglich, zwei ngClassAnweisungen auf ein Element zu setzen.
Seldary

Vielen Dank! Dies scheint an anderer Stelle bestätigt zu sein.
JWG

2
Sie werden überrascht sein: <a href="#/u/[[msg.from]]" ng-bind="msg.from" class="name, ng-class:[users[msg.from].nice, users[msg.from].star];" ng-class="{premium: users[msg.from].premium}"></a>und mehr: scotch.io/tutorials/javascript/the-many-ways-to-use-ngclass
mayankcpdixit

1
@jwg: Sie können zwei Arten von Vorlagen kombinieren und ist hier: stackoverflow.com/questions/29230732/…
satish kumar V

12

Hier ist ein Beispiel für den Vergleich mehrerer Winkel-UI-Router-Zustände mit OR || Operator:

<li ng-class="
    {
        warning:
            $state.includes('out.pay.code.wrong')
            || $state.includes('out.pay.failed')
        ,
        active:
            $state.includes('out.pay')
    }
">

Es gibt dem li die Klassen Warnung und / oder aktiv, abhängig davon, ob die Bedingungen erfüllt sind.


Ich kann mich nicht wirklich erinnern. Ist es nicht logisch?
Nitech

Vielen Dank, dass Sie klargestellt haben, dass mehrere Klassen aus demselben ng-Klassenblock angewendet werden können, solange jede ihrer Bedingungen erfüllt ist.
Cedricdlb

6

Unter active und activemenu befinden sich Klassen und itemCount und ShowCart sind Ausdrucks- / Boolesche Werte.

ng-class="{'active' : itemCount, 'activemenu' : showCart}"

5

Mit mehreren Bedingungen

<div ng-class="{'class1' : con1 || can2, 'class2' : con3 && con4}">
Hello World!
</div>

4

Dank Scotch.io einen anderen Weg gefunden

<div ng-repeat="step in steps" class="step-container step" ng-class="[step.status, step.type]" ng-click="onClick(step.type)">

Dies war meine Referenz. PFAD


3

Auf andere Weise können wir eine Funktion erstellen, um "mit mehreren Klassen" zu steuern.

CSS

 <style>
    .Red {
        color: Red;
    }
    .Yellow {
        color: Yellow;
    }
      .Blue {
        color: Blue;
    }
      .Green {
        color: Green;
    }
    .Gray {
        color: Gray;
    }
    .b {
         font-weight: bold;
    }
</style>

Skript

<script>
    angular.module('myapp', [])
            .controller('ExampleController', ['$scope', function ($scope) {
                $scope.MyColors = ['It is Red', 'It is Yellow', 'It is Blue', 'It is Green', 'It is Gray'];
                $scope.getClass = function (strValue) {
                    if (strValue == ("It is Red"))
                        return "Red";
                    else if (strValue == ("It is Yellow"))
                        return "Yellow";
                    else if (strValue == ("It is Blue"))
                        return "Blue";
                    else if (strValue == ("It is Green"))
                        return "Green";
                    else if (strValue == ("It is Gray"))
                        return "Gray";
                }
        }]);
</script>

Es benutzen

<body ng-app="myapp" ng-controller="ExampleController">

<h2>AngularJS ng-class if example</h2>
<ul >
    <li ng-repeat="icolor in MyColors" >
        <p ng-class="[getClass(icolor), 'b']">{{icolor}}</p>
    </li>
</ul>

Sie können sich bei Beispiel auf die vollständige Codepage in der ng-Klasse beziehen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.