AngularJS chuyển đổi lớp bằng ng-class


217

Tôi đang cố gắng chuyển đổi lớp của một phần tử bằng cách sử dụng ng-class

<button class="btn">
  <i ng-class="{(isAutoScroll()) ? 'icon-autoscroll' : 'icon-autoscroll-disabled'}"></i>
</button>

isAutoScroll ():

$scope.isAutoScroll = function()
{
    $scope.autoScroll = ($scope.autoScroll) ? false : true;
    return $scope.autoScroll;
}

Về cơ bản, nếu $scope.autoScrolllà đúng, tôi muốn ng-class là icon-autoscrollvà nếu nó sai, tôi muốn nó làicon-autoscroll-disabled

Những gì tôi có bây giờ không hoạt động và đang tạo ra lỗi này trong bảng điều khiển

Error: Lexer Error: Unexpected next character at columns 18-18 [?] in expression [{(isAutoScroll()) ? 'icon-autoscroll' : 'icon-autoscroll-disabled'}].

Làm thế nào để tôi làm điều này một cách chính xác?

BIÊN TẬP

giải pháp 1: (lỗi thời)

<button class="btn" ng-click="autoScroll = !autoScroll">
  <i ng-class="{'icon-autoscroll': autoScroll, 'icon-autoscroll-disabled': !autoScroll}"></i>
</button>

CHỈNH SỬA 2

giải pháp 2:

Tôi muốn cập nhật giải pháp vì Solution 3, được cung cấp bởi Stewie, nên là giải pháp được sử dụng. Đó là tiêu chuẩn nhất khi nói đến toán tử ternary (và với tôi dễ đọc nhất). Giải pháp sẽ là

<button class="btn" ng-click="autoScroll = !autoScroll">
  <i ng-class="autoScroll ? 'icon-autoscroll' : 'icon-autoscroll-disabled'"></i>
</button>

Dịch sang:

if (autoScroll == true) ?// sử dụng lớp 'icon-autoscroll' :// sử dụng khác'icon-autoscroll-disabled'


không thể sử dụng các điều kiện trong angular expressionsmỗi tài liệu => Không có Báo cáo luồng điều khiển: bạn không thể thực hiện bất kỳ điều nào sau đây trong biểu thức góc: điều kiện, vòng lặp hoặc ném. Sử dụng chức năng hoặc chỉ thị khác
charlietfl 13/03/13

@Ronnie Tôi thấy giải pháp của bạn, và nó thật tuyệt. nhưng tôi tự hỏi tại sao autoScrollở đây sẽ chỉ có hiệu lực trong mỗi nút? (Tôi đã thử nghiệm điều này với nhiều nút và nó cũng hoạt động tốt) Ý tôi là, khi tôi nhấp vào từng nút, nó chỉ có tác dụng với nút đó, thay vì tất cả các nút.
zx1986

Câu trả lời:


436

Cách sử dụng có điều kiện trong ng-class:

Giải pháp 1:

<i ng-class="{'icon-autoscroll': autoScroll, 'icon-autoscroll-disabled': !autoScroll}"></i>

Giải pháp 2:

<i ng-class="{true: 'icon-autoscroll', false: 'icon-autoscroll-disabled'}[autoScroll]"></i>

Giải pháp 3 (góc v.1.1.4 + hỗ trợ được giới thiệu cho toán tử ternary):

<i ng-class="autoScroll ? 'icon-autoscroll' : 'icon-autoscroll-disabled'"></i>

Plunker


3
Ví dụ thứ hai sạch hơn, nhưng thật nực cười khi bạn không thể đặt biến bạn đang đánh giá ở phía trước biểu thức ... nó chỉ đọc buồn cười. Hãy tưởng tượng nhìn biểu thức như một câu lệnh if: "if (biến) true: làm điều này, sai: làm điều đó ... ugh #fullynerdy
mattdlockyer

10
@Stewie Faaakin người bạn đời tuyệt đẹp, thích cách nó trông giống như mã thật và không phải là một biểu hiện bastardized: D
mattdlockyer

Trên thực tế việc đánh giá giá trị đầu tiên khá hữu ích vì nó tránh vô tình gán cho biến một giá trị mới.
lharby

Ternary chính xác là những gì tôi đang tìm kiếm. Tốt công việc cung cấp ba ví dụ với các chi tiết hỗ trợ phiên bản.
TaeKwonJoe

13

Là giải pháp thay thế, dựa trên toán tử logic javascript '&&' trả về đánh giá cuối cùng, bạn cũng có thể thực hiện việc này như sau:

<i ng-class="autoScroll && 'icon-autoscroll' || !autoScroll && 'icon-autoscroll-disabled'"></i>

Nó chỉ ngắn hơn một chút, nhưng đối với tôi dễ đọc hơn.


10

Thêm nhiều hơn một lớp dựa trên điều kiện:

<div ng-click="AbrirPopUp(s)" 
ng-class="{'class1 class2 class3':!isNew, 
           'class1 class4': isNew}">{{ isNew }}</div>

Áp dụng: class1 + class2 + class3 khi isNew = false ,

Áp dụng: class1 + class4 khi isNew = true


6
<div data-ng-init="featureClass=false" 
     data-ng-click="featureClass=!featureClass" 
     data-ng-class="{'active': featureClass}">
    Click me to toggle my class!
</div>

Tương tự như toggleClassphương thức của jQuery , đây là một cách để bật / tắt activelớp khi phần tử được nhấp.


2
Bạn có thể cung cấp thêm một số thông tin về câu trả lời của bạn bằng tiếng Anh? Làm thế nào nó khác với các câu trả lời đã ở đây?
Onots

2
Tôi không chắc tại sao câu trả lời này có nhiều phiếu bầu tiêu cực ?? Đây là giải pháp thực sự hiệu quả với tôi hơn những người khác ở trên ...
Paulo Griiettner 8/2/2016

2
Tôi nghĩ rằng mô tả được viết xấu và mọi người phản ứng với từ "jQuery". Mô tả này có nghĩa gì để nói là "Đây là tương tự như hàm toggleClass trong JQuery". BTW, bạn có cần khởi tạo biến không?
Thiết kế bởi Adrian

1

autoscroll sẽ được xác định và sửa đổi trong bộ điều khiển.

<span ng-class= "autoscroll?'class_if_true':'class_if_false'"></span>

Thêm nhiều lớp dựa trên điều kiện bằng cách:

<span ng-class= "autoscroll?'first second third':'classes_if_false'"></span>


-1

Tôi đã thực hiện công việc này theo cách này:

<button class="btn" ng-click='toggleClass($event)'>button one</button>
<button class="btn" ng-click='toggleClass($event)' >button two</button>

// trong bộ điều khiển của bạn

 $scope.toggleClass = function (event){
        $(event.target).toggleClass('active');
    }

2
Trong khi nó hoạt động, bạn đang trộn góc cạnh và jQuery. Bạn nên cố gắng và tránh điều đó nếu bạn có thể. Những gì được yêu cầu ban đầu có thể được thực hiện mà không có một sự kiện nhấp chuột. Điều gì nếu bạn có một nút khác được cho là để chuyển lớp này trên nút của bạn ở trên? Nó sẽ không cập nhật ngay bây giờ vì bạn đang thay đổi nó khi nhấp và không qua lớp ng
Ronnie

1
Đó là từ jqLite. Để biết thêm docs.angularjs.org/api/ng/feft/angular.element
Ruhul Amin

1
Tôi hiểu. Quan điểm của tôi là bạn không cần sử dụng jQuery bất cứ điều gì để đạt được câu trả lời cho câu hỏi ban đầu.
Ronnie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.