2014-03-28 6 views
19

Hier sind zwei verschiedene Möglichkeiten, die ng-class Direktive zu verwenden. Ich brauche sie beide, auf demselben Element, aber das funktioniert nicht.AngularJS - Wie füge ich mehrere ng-class Direktiven hinzu?

ein Objekt in ng-Klasse verwenden

http://plnkr.co/edit/uZNK7I?p=preview

<div ng-repeat="item in [1, 2, 3, 4, 5]" 
    ng-class="{ first: $first, last: $last }">{{item}}</div> 

Ergebnisse korrekt in

<div class="first">1</div> 
<div>2</div> 
<div>3</div> 
<div>4</div> 
<div class="last">5</div> 

einen Ausdruck in ng-Klasse verwenden

http://plnkr.co/edit/tp6lgR?p=preview

<div ng-repeat="item in [1, 2, 3, 4, 5]" 
    ng-class=" 'count-' + ($index + 1) ">{{item}}</div> 

Ergebnisse richtig in

<div class="count-1">1</div> 
<div class="count-2">2</div> 
<div class="count-3">3</div> 
<div class="count-4">4</div> 
<div class="count-5">5</div> 

Nun, wie sie etwa zusammen verwenden?

Ich brauche dynamische Klassennamen (wie 'count-' + n), aber auch die Objekt-Syntax für mehrere Klassen.

Ich kann nicht einfach 2 ng-class Attribute (http://plnkr.co/edit/OLaYke?p=preview) verwenden, nur die erste funktioniert.

Irgendwelche Vorschläge?

Antwort

20

Sie sollten nicht ng-class für die zweite verwenden möchten, verwenden

<div class="count-{{$index + 1}}" ng-class="{ first: $first, last: $last }"> 
+0

Dies scheint zu funktionieren (http://plnkr.co/edit/OLaYke?p=preview), obwohl ich nicht sicher bin über ie8 (und leider plinkr funktioniert nicht in ie8, und ich habe nicht Zeit, dies einzurichten und zu testen) –

+0

Nach eckigen Dokumenten vorgeschlagene Lösung ist eine schlechte Praxis: https://docs.angularjs.org/api/ng/directive/ngClass#known-issues Siehe meine Antwort unten für empfohlenen Weg es zu tun –

+0

@MaximKulikov - Es sagt nicht, dass irgendwo, es heißt, keine Interpolation zu verwenden. '{{}}' unterscheidet sich von der oben angezeigten Syntax. – tymeJV

0

ich, was Sie atributes ng-class mit ;

try trennen kann:

ng-class=" 'count-' + ($index + 1) ; { first: $first, last: $last }" 
+0

Dies scheint zu funktionieren (http://plnkr.co/edit/OLaYke?p=preview), und dies könnte ein besserer Ansatz für ie8 sein –

+4

Eigentlich glaube ich nicht, dass das funktioniert ... Es scheint nur zu gehorchen die zweite Regel ... –

+0

Das hat nicht für mich funktioniert, aber diese Antwort hat den Trick http://stackoverflow.com/questions/18871277/adding-multiple-class-using-ng-class –

2

Wenn Sie brauchen um sie miteinander zu vermischen, gehen Sie einfach auf Strings concat:

ng-class="'count-' + ($index+1) + ($first?' first':($last?' last':''))" 

Oder für eine klarere Sicht:

ng-class="'count-' + ($index+1) + ($first?' first':'') + ($last?' last':'')" 

Es gibt für nicht bekannte Profis class="{{exp}}" statt ng-class="exp" verwenden, da beide, wenn der Wert von exp Änderungen aktualisiert. Im Gegenteil, die erste Seite könnte in einigen Fällen zum Einfrieren der Seite führen.

+0

Danke, habe ich nicht wir wissen, dass wir ternäre Ausdrücke in der ng-Klasse verwenden können. – BrDaHa

7

Sie bieten sollte ngClass mit einem Array, das sowohl Ausdruck und Objekt enthält:

<div ng-class="['count-' + ($index + 1), { first: $first, last: $last }]"> 

Hinweis: Die Lösung in akzeptierte Antwort vorgeschlagen (gleichzeitige Nutzung von ngClass Richtlinie und Interpolation in class Attribut) ist eine schlechte Übung. Siehe mehr Details here und here.