2014-09-29 14 views
23

Tôi có một vấn đề rất lạ. Tôi phải đặt một lớp học active trên <li> thích hợp khi số $scope.selectedCat == cat.id. Danh sách được tạo bằng ng-repeat. Nếu selectedCat là sai, mục danh sách 'Duyệt Tất cả Danh mục' (bên ngoài ng-lặp lại) được đặt thành hoạt động. setCat() đặt giá trị của biến $scope.selectedCat:thay đổi điều kiện ng-class, nhưng không cập nhật các lớp học

<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> 

Khi tải trang web, mọi thứ hoạt động tốt (ảnh chụp từ 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}"> 

Tuy nhiên khi tôi đặt $ scope.selectedClass đến một giá trị cat.id, các điều kiện trong ng-class được đánh giá đúng, nhưng ng-class sẽ không cập nhật các lớp học cho phù hợp:

<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}"> 

Xin lưu ý t mũ trong dòng hoạt động đầu tiên vẫn được thiết lập, trong khi ng-class đánh giá sai. Trong dòng cuối cùng hoạt động không được thiết lập, trong khi ng-class đánh giá là true.

Bất kỳ ý tưởng nào tại sao nó không hoạt động? Cách góc chính xác để làm điều này là gì?

Trả lời

34

Thay thế:

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

Với:

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

Bạn không bao giờ cần phải tổ những dấu ngoặc nhọn như vậy, trong góc.

Hãy xem ng-class documentation để biết thêm một số ví dụ.

+0

Bạn cũng có thể sử dụng một chức năng mà được tên lớp nếu nó là năng động, mà có thể giúp nếu bạn cần các lớp học như: tích cực-1 (và -1 phụ thuộc vào cái gì khác), chỉ cần concat sẽ không làm mới nếu thay đổi "-1" thành "-2". – porfiriopartida

13

Thay vì

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

sử dụng

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

Tôi có ** dấu nháy đơn ** cũng bị xóa. Bạn không cần nó xung quanh 'hoạt động'. Tôi không được phép thêm nó làm nhận xét cho câu trả lời của bạn, đó là lý do tại sao được đăng dưới dạng câu trả lời riêng. Xin lỗi vì bạn cảm thấy xấu. –

4

Hi tôi cũng đang phải đối mặt với cùng một vấn đề. tôi giải quyết vấn đề bằng cách thay vì gán giá trị trực tiếp cho ng-class, gọi phương thức riêng và trả về giá trị.

ví dụ:

ng-class="getStyleClass(cat)" 

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

khoảng i mã. xin vui lòng thay đổi phương pháp theo yêu cầu của bạn.

+0

Thật điên rồ. Nghĩ rằng nó sẽ hoạt động giống như khi sử dụng cú pháp [không rõ] của 'ng-class =" {true: 'active', false: 'muted'} [x == y] "'. Cú pháp này luôn luôn rebinds/debinds các lớp. – Cody

+0

Làm xước điều đó. Điều này không hiệu quả với tôi. Nó vẫn đặt kiểu trên mỗi mục [đã chọn], nhưng khi '$ scope.selected' thay đổi (thông qua' isSelected (date) -> return this.selected === date'), mỗi mục được liên tục giữ lại kiểu này khi lựa chọn khác. – Cody

1

Mở rộng trên câu trả lời @Cerbrus cho:

Thay thế:

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

Với:

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

Tôi đã có một vấn đề với một biểu thức sử dụng af ilter, mà sẽ không đánh giá đúng cách mà không có dấu ngoặc nhọn đôi {{ }}.

Ví dụ: ng-class="{'active': {{ selectedCat | filter:catType }} == cat.id}"

Tôi giải quyết nó bằng cách đặt dấu ngoặc đơn thay vì dấu ngoặc nhọn.

Giải pháp: ng-class="{'active': (selectedCat | filter:catType) == cat.id}"

Các vấn đề liên quan