2014-09-29 5 views
23

Ich habe ein sehr seltsames Problem. Ich muss eine active Klasse auf die entsprechende <li> wenn die $scope.selectedCat == cat.id. Die Liste wird mit ng-repeat generiert. Wenn selectedCat den Wert false hat, wird der Listeneintrag 'Alle Kategorien durchsuchen' (außerhalb von ng-repeat) auf aktiv gesetzt. setCat() setzt den Wert des $scope.selectedCat Variable:ng-Klasse Zustand ändert, aber nicht aktualisiert Klassen

<div id="cat-list" ng-controller="CatController"> 
    <li ng-class="{'active': {{selectedCat == false}}}"> 
     <a> 
      <div class="name" ng-click="setCat(false)" >Browse All Categories</div> 
     </a> 
    </li> 
    <li class="has-subcat" ng-repeat="cat in cats | filter:catsearch" ng-class="{'active': {{selectedCat == cat.id}}}"> 
     <a> 
      <div cat class="name" ng-click="setCat({{cat.id}})" ng-bind-html="cat.name | highlight:catsearch"></div> 
     </a> 
    </li> 
</div> 

Wenn die Seite geladen wird, funktioniert alles einwandfrei (Snapshot von FireBug):

<li ng-class="{'active': true}" class="ng-scope active"> 
<!-- ngRepeat: cat in cats | filter:catsearch --> 
<li class="has-subcat ng-isolate-scope" ng-repeat="cat in cats | filter:catsearch" ng-class="{'active': false}"> 

Allerdings, wenn ich $ scope.selectedClass auf einen cat.id Wert gesetzt, Die Bedingung in ng-class wird korrekt ausgewertet, aber ng-class aktualisiert die Klassen nicht entsprechend:

<li ng-class="{'active': false}" class="ng-scope active"> <!--Right here!--> 
<!-- ngRepeat: cat in cats | filter:catsearch --> 
<li class="has-subcat ng-isolate-scope" ng-repeat="cat in cats | filter:catsearch" ng-class="{'active': true}"> 

Bitte beachten Sie t Hat in der ersten Zeile aktive Klasse bleibt festgelegt, während ng-Klasse zu false ausgewertet wird. In der letzten Zeile ist active nicht gesetzt, während ng-class als true ausgewertet wird.

Irgendwelche Ideen, warum es nicht funktioniert? Was ist die richtige Winkelform, dies zu tun?

Antwort

34

ersetzen:

ng-class="{'active': {{selectedCat == cat.id}}}" 

mit:

ng-class="{'active': selectedCat == cat.id}" 

Sie müssen nie diese geschweiften Klammern wie das zu nisten, in Angular.

Werfen Sie einen Blick auf die ng-class documentation für einige weitere Beispiele.

+0

Sie auch eine Funktion, die den Klassennamen bekommt, wenn es dynamisch ist, die helfen würden, wenn Sie benötigen Klassen wie verwenden: (-1 und hängt davon ab, etwas anderes) aktiv-1, nur concat würde nicht aktualisieren, wenn sich die "-1" zu "-2" ändert. – porfiriopartida

13

Statt

ng-class="{'active': {{selectedCat == cat.id}}}" 

Verwendung

ng-class="{active: selectedCat == cat.id}" 
+3

Ich habe die ** einfachen Anführungszeichen ** auch entfernt. Sie brauchen das nicht um "aktiv". Ich durfte es nicht als Kommentar zu deiner Antwort hinzufügen, darum wurde es als separate Antwort gepostet. Entschuldigung, seit du dich schlecht gefühlt hast. –

4

Hallo, ich bin auch vor dem gleichen Problem. Ich habe das Problem übrigens gelöst, anstatt den Wert direkt der ng-Klasse zuzuweisen, die separate Methode aufzurufen und den Wert zurückzugeben.

ex:

ng-class="getStyleClass(cat)" 

$scope.getStyleClass = function(cat) { 
     return "active: selectedCat == cat.id"; 
} 

grob codiert i. Bitte ändern Sie die Methode gemäß Ihrer Anforderung.

+0

Das ist verrückt. Ich dachte, es würde sich genauso verhalten wie bei der Verwendung der [gut bekannten] Syntax von 'ng-class =" {true: 'active', false: 'stumm'} [x == y] "'. Diese Syntax bindet/entbindet die Klassen immer. – Cody

+0

Scratch das. Das funktioniert nicht für mich. Es wird immer noch der Stil auf jedes [ausgewählte] Element angewendet, aber wenn sich $ scope.selected ändert (über mein 'isSelected (date) -> this.selected === date zurückgeben), behalten alle aufeinander folgenden Elemente diesen Stil nach anderen Auswahlen. – Cody

1

Aufbauend auf der Antwort @Cerbrus gab:

ersetzen:

ng-class="{'active': {{selectedCat == cat.id}}}"

mit:

ng-class="{'active': selectedCat == cat.id}"

Ich hatte ein Problem mit einem Ausdruck mit af ilter, das würde ohne geschweifte Klammern {{ }} nicht richtig bewerten.

Beispiel: ng-class="{'active': {{ selectedCat | filter:catType }} == cat.id}"

Ich löste es durch Klammern anstelle von geschweiften Klammern setzen.

Lösung: ng-class="{'active': (selectedCat | filter:catType) == cat.id}"