AngularJS ngClass có điều kiện


499

Có cách nào để tạo một biểu thức cho một cái gì đó giống như ng-classlà một điều kiện?

Ví dụ: tôi đã thử như sau:

<span ng-class="{test: 'obj.value1 == \'someothervalue\''}">test</span>

Vấn đề với mã này là bất kể obj.value1là gì , kiểm tra lớp luôn được áp dụng cho phần tử. Làm điều này:

<span ng-class="{test: obj.value2}">test</span>

Miễn là obj.value2không bằng một giá trị trung thực, lớp trong không được áp dụng. Bây giờ tôi có thể giải quyết vấn đề trong ví dụ đầu tiên bằng cách thực hiện điều này:

<span ng-class="{test: checkValue1()}">test</span>

Trường hợp checkValue1chức năng trông như thế này:

$scope.checkValue1 = function() {
  return $scope.obj.value === 'somevalue';
}

Tôi chỉ tự hỏi nếu đây là làm thế nào ng-classlà phải làm việc. Tôi cũng đang xây dựng một chỉ thị tùy chỉnh nơi tôi muốn làm một cái gì đó tương tự như thế này. Tuy nhiên, tôi không thể tìm cách xem biểu thức (và có lẽ điều đó là không thể và lý do tại sao nó hoạt động như thế này).

Đây là một plnkr để hiển thị những gì tôi có ý nghĩa.


Có một câu trả lời cho câu trả lời này: stackoverflow.com/questions/14788652/
Kẻ

43
Các lớp học có dấu gạch ngang cần được trích dẫn:ng-class="'label-success': obj.value1 == 'Ready', 'label-warning': obj.value1 == 'On hold'}"
Brent Washburne

2
Chúng ta có thể sử dụng điều kiện nhiều hơn với ng-class, xem trên blog này goo.gl/qfEQZw
Virender


"Các lớp có dấu gạch ngang cần có hàng mi '' '' '' '
richard

Câu trả lời:


596

Nỗ lực đầu tiên của bạn là gần như đúng, Nó sẽ hoạt động mà không có dấu ngoặc kép.

{test: obj.value1 == 'someothervalue'}

Đây là một plnkr .

Lệnh ngClass sẽ hoạt động với bất kỳ biểu thức nào đánh giá sự thật hoặc falsey, hơi giống với biểu thức Javascript nhưng với một số khác biệt, bạn có thể đọc về đây . Nếu điều kiện của bạn quá phức tạp, thì bạn có thể sử dụng một hàm trả về sự thật hoặc falsey, như bạn đã làm trong lần thử thứ ba.

Chỉ để bổ sung: Bạn cũng có thể sử dụng các toán tử logic để tạo thành các biểu thức logic như

ng-class="{'test': obj.value1 == 'someothervalue' || obj.value2 == 'somethingelse'}"

2
Cảm ơn, vì bất kỳ lý do gì, tôi nghĩ rằng vì đây là một biểu thức là giá trị của đối tượng, toàn bộ điều phải được trích dẫn.
ryanzec

8
bọc tên lớp bằng 'cách khác nếu bạn muốn thêm nhiều lớp hơn hoặc nếu lớp của bạn có dấu gạch nối hoặc dấu gạch dưới thì nó sẽ không hoạt động. ng-class="{'test test-2: obj.value1 === 'value'}"
Andrea Turri

6
@Andrea, bạn đã quên trích dẫn kết thúc: ng-class="{'test test-2': obj.value1 === 'value'}"
ErikE

Đối với Angular2 (mà tôi đã cố gắng tìm) sử dụng (các) thuộc tính như : [class.test]="obj.value1 == 'someotervalue'".
kub1x

FYI cho độc giả, bạn cũng có thể có dấu ngoặc. ng-class="{danger:!enabled || (type === 'WHEEL' && !isOnline) }
daCoda

227

Sử dụng ng-class bên trong ng-repeat

<table>
    <tbody>
            <tr ng-repeat="task in todos"
                ng-class="{'warning': task.status == 'Hold' , 'success': task.status == 'Completed',
              'active': task.status == 'Started', 'danger': task.status == 'Pending' } ">
                <td>{{$index + 1}}</td>
                <td>{{task.name}}</td>
                <td>{{task.date|date:'yyyy-MM-dd'}}</td>
                <td>{{task.status}}</td>
            </tr>
    </tbody>
</table>

Đối với mỗi trạng thái trong task.status, một lớp khác nhau được sử dụng cho hàng.


Ví dụ hoàn hảo với nhiều lớp, Cảm ơn!
Saletanth Karini

112

Angular JS cung cấp chức năng này trong Chỉ thị ng-class . Trong đó bạn có thể đặt điều kiện và cũng chỉ định lớp có điều kiện. Bạn có thể đạt được điều này theo hai cách khác nhau.

Loại 1

<div ng-class="{0:'one', 1:'two',2:'three'}[status]"></div>

Trong lớp mã này sẽ được áp dụng theo giá trị của giá trị trạng thái

nếu giá trị trạng thái0 thì áp dụng lớp một

nếu giá trị trạng thái1 thì áp dụng lớp hai

nếu giá trị trạng thái2 thì áp dụng lớp ba


Loại 2

<div ng-class="{1:'test_yes', 0:'test_no'}[status]"></div>

Trong đó lớp sẽ được áp dụng theo giá trị của trạng thái

nếu giá trị trạng thái1 hoặc đúng thì nó sẽ thêm lớp test_yes

nếu giá trị trạng thái0 hoặc sai thì nó sẽ thêm lớp test_no


1
tình trạng ở đây là gì?
CommonSenseCode

Trạng thái là giá trị mà bạn muốn kiểm tra hoặc xác nhận theo lớp nào sẽ được áp dụng.
Kaushal Khamar

4
Thích cách này vì nó linh hoạt hơn và ít điên rồ hơn khi xử lý nhiều giá trị
Eduardo La Hoz Miranda

Làm thế nào về việc sử dụng nó cho nhiều lớp. Giống như, <div ng-class = "{0: 'một', 1: 'hai', 2: 'ba'} [status], {0: 'one', 1: 'hai'} [status1]"> </ div>
parth.hirpara

1
chúng ta có thể sử dụng điều này trong trường hợp như vậy không: <div ng-class="{'Image' || 'image': 'image-icon', 'Video' || 'video' || 'aVideo' || 'bVideo' : 'video-icon'}[resource.type]"></div>
Chandra Kant Paliwal

80

Tôi thấy các ví dụ tuyệt vời ở trên nhưng tất cả đều bắt đầu bằng dấu ngoặc nhọn (bản đồ json). Một lựa chọn khác là trả về một kết quả dựa trên tính toán. Kết quả cũng có thể là một danh sách các tên lớp css (không chỉ bản đồ). Thí dụ:

ng-class="(status=='active') ? 'enabled' : 'disabled'"

hoặc là

ng-class="(status=='active') ? ['enabled'] : ['disabled', 'alik']"

Giải thích: Nếu trạng thái được kích hoạt, lớp enabledsẽ được sử dụng. Nếu không, lớp disabledsẽ được sử dụng.

Danh sách []này được sử dụng để sử dụng nhiều lớp (không chỉ một).


1
Đáng yêu, tất cả các ví dụ tuyệt vời, nhưng tôi thích bạn nhất!
Stormec56

48

Có một phương thức đơn giản mà bạn có thể sử dụng với thuộc tính lớp html và tốc ký nếu / khác. Không cần phải làm cho nó quá phức tạp. Chỉ cần sử dụng phương pháp sau đây.

<div class="{{expression == true ? 'class_if_expression_true' : 'class_if_expression_false' }}">Your Content</div>

Mã hóa hạnh phúc, Nimantha Perera


2
Người này nhận được nó. Cảm ơn nụ
Deepakgates

36

Tôi sẽ chỉ cho bạn hai phương thức để bạn có thể áp dụng ng-class một cách linh hoạt

Bước 1

Bằng cách sử dụng toán tử ternary

<div ng-class="condition?'class1':'class2'"></div>

Đầu ra

Nếu điều kiện của bạn là đúng thì class1 sẽ được áp dụng cho phần tử của bạn, class2 khác sẽ được áp dụng.

Bất lợi

Khi bạn sẽ cố gắng thay đổi giá trị có điều kiện trong thời gian chạy, lớp nào đó sẽ không thay đổi. Vì vậy, tôi sẽ đề nghị bạn đi đến bước 2 nếu bạn có yêu cầu như thay đổi lớp động.

Bước 2

<div ng-class="{value1:'class1', value2:'class2'}[condition]"></div>

Đầu ra

nếu điều kiện của bạn khớp với value1 thì class1 sẽ được áp dụng cho phần tử của bạn, nếu khớp với value2 thì class2 sẽ được áp dụng, v.v. Và thay đổi lớp năng động sẽ làm việc tốt với nó.

Hy vọng điều này sẽ giúp bạn.


36

Cú pháp góc là sử dụng toán tử : để thực hiện tương đương với một công cụ sửa đổi if

<div ng-class="{ 'clearfix' : (row % 2) == 0 }">

Thêm lớp Clearfix vào các hàng chẵn. Tuy nhiên, biểu thức có thể là bất cứ điều gì chúng ta có thể có trong điều kiện bình thường nếu điều kiện và nó nên đánh giá là đúng hoặc sai.


1
Đẹp! Ngoài ra, bên trong ng-repeat, bạn có thể sử dụng $ thậm chí để đặt lớp. Ví dụ: ng-class = "$ chẵn? 'Thậm chí': 'lẻ'". Các công cụ tiện lợi khác bên trong ng-repeat là $ đầu tiên, $ cuối cùng, $ chẵn, $ lẻ ...
Tối đa

15

Sử dụng hàm với ng-class là một lựa chọn tốt khi ai đó phải chạy logic phức tạp để quyết định lớp CSS phù hợp.

http://jsfiddle.net/ms403Ly8/2/

HTML:

<div ng-app>
  <div ng-controller="testCtrl">
        <div ng-class="getCSSClass()">Testing ng-class using function</div>       
    </div>
</div>

CSS:

.testclass { Background: lightBlue}

JavaScript :

function testCtrl($scope) {
    $scope.getCSSClass = function() {
     return "testclass ";
  }     
}

2
Tôi nghĩ rằng điều này trộn lẫn các mối quan tâm. Một bộ điều khiển nên trừu tượng hơn và không quan tâm đến các lớp css, mà là trạng thái. Dựa trên trạng thái, các lớp css nên được áp dụng trong mẫu. Bằng cách này, bộ điều khiển độc lập với mẫu và có thể tái sử dụng dễ dàng hơn.
Hubert Grzeskowiak

9

dùng cái này

<div ng-class="{states}[condition]"></div>

ví dụ: nếu điều kiện là [2 == 2], các trạng thái là {true: '...', false: '...'}

<div ng-class="{true: 'ClassA', false: 'ClassB'}[condition]"></div>

Nhưng nếu tôi có 3 điều kiện trở lên, điều này sẽ không hoạt động? vì điều này sẽ chỉ trả lại các conditons đúng và sai
Ali Al Amine

điều kiện có nghĩa là đúng hoặc sai. Bạn có nghĩa là một cái gì đó có nhiều hơn 2 giá trị ?? @AlyAlAmeen
Saeed

7

Đối với Angular 2, sử dụng cái này

<div [ngClass]="{'active': dashboardComponent.selected_menu == 'mapview'}">Content</div>

Để mở rộng điều này, đối với Angular 2, bạn áp dụng một lớp và cũng là một công cụ sửa đổi lớp trong một điều kiện if / khác sử dụng một mảng như vậy:[ngClass]="['base-class', thread.isActive ? 'base-class--active' : '']"
Matt Rabe

5

ng-classlà một Chỉ thị của AngularJs cốt lõi. Trong đó bạn có thể sử dụng "Cú pháp chuỗi", "Cú pháp mảng", "Biểu thức được đánh giá", "Toán tử Ternary" và nhiều tùy chọn khác được mô tả bên dưới:

ngClass sử dụng chuỗi cú pháp

Đây là cách đơn giản nhất để sử dụng ngClass. Bạn chỉ có thể thêm một biến Angular vào ng-class và đó là lớp sẽ được sử dụng cho phần tử đó.

<!-- whatever is typed into this input will be used as the class for the div below -->
<input type="text" ng-model="textType">

<!-- the class will be whatever is typed into the input box above -->
<div ng-class="textType">Look! I'm Words!

Ví dụ demo của ngClass bằng chuỗi cú pháp

ngClass sử dụng cú pháp mảng

Điều này tương tự như phương thức cú pháp chuỗi trừ bạn có thể áp dụng nhiều lớp.

<!-- both input boxes below will be classes for the div -->
<input type="text" ng-model="styleOne">
<input type="text" ng-model="styleTwo">

<!-- this div will take on both classes from above -->
<div ng-class="[styleOne, styleTwo]">Look! I'm Words!

ngClass sử dụng biểu thức đánh giá

Một phương pháp nâng cao hơn của việc sử dụng ngClass (và một phương pháp mà bạn có thể sẽ sử dụng nhiều nhất) là đánh giá một biểu thức. Cách thức này hoạt động là nếu một biến hoặc biểu thức ước lượng true, bạn có thể áp dụng một lớp nhất định. Nếu không, lớp sẽ không được áp dụng.

<!-- input box to toggle a variable to true or false -->
<input type="checkbox" ng-model="awesome"> Are You Awesome?
<input type="checkbox" ng-model="giant"> Are You a Giant?

<!-- add the class 'text-success' if the variable 'awesome' is true -->
<div ng-class="{ 'text-success': awesome, 'text-large': giant }">

Ví dụ về ngClass sử dụng biểu thức đánh giá

ngClass sử dụng giá trị

Điều này tương tự với phương thức biểu thức được đánh giá ngoại trừ bạn chỉ có thể so sánh nhiều giá trị với biến duy nhất.

<div ng-class="{value1:'class1', value2:'class2'}[condition]"></div>

ngClass Sử dụng toán tử Ternary

Toán tử ternary cho phép chúng ta sử dụng tốc ký để chỉ định hai lớp khác nhau, một nếu một biểu thức là đúng và một cho sai. Đây là cú pháp cơ bản cho toán tử ternary:

ng-class="$variableToEvaluate ? 'class-if-true' : 'class-if-false'">

Đánh giá số đầu tiên, số cuối hoặc số cụ thể

Nếu bạn đang sử dụng ngRepeatchỉ thị và bạn muốn áp dụng các lớp học vào first, lasthoặc một số cụ thể trong danh sách, bạn có thể sử dụng tính chất đặc biệt của ngRepeat. Chúng bao gồm $first, $last, $even, $odd, và một vài người khác. Đây là một ví dụ về cách sử dụng chúng.

<!-- add a class to the first item -->
<ul>
  <li ng-class="{ 'text-success': $first }" ng-repeat="item in items">{{ item.name }}</li>
</ul>

<!-- add a class to the last item -->
<ul>
  <li ng-class="{ 'text-danger': $last }" ng-repeat="item in items">{{ item.name }}</li>
</ul>

<!-- add a class to the even items and a different class to the odd items -->
<ul>
  <li ng-class="{ 'text-info': $even, 'text-danger': $odd }" ng-repeat="item in items">{{ item.name }}</li>
</ul>
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.