Thêm nhiều lớp bằng ng-class


542

Chúng ta có thể có nhiều biểu thức để thêm nhiều ng-class không?

ví dụ

<div ng-class="{class1: expressionData1, class2: expressionData2}"></div>

Nếu có ai có thể đưa ra ví dụ để làm như vậy.

.


17
Ví dụ của bạn hoạt động như vốn có.
Steve Klösters

Có nó, tôi chỉ cần sử dụng! Quan trọng trong css để làm cho nó hiển thị. Tôi tự tìm thấy nó :)
Aditya Sethi

Những gì @stevuu nói .. là ri8 ... câu hỏi của bạn là câu trả lời
YaswanthJg

Giá trị biểu thứcData1 thường nhận đúng / sai, hoặc một số giá trị chuỗi thực sự?
Martian2049

Câu trả lời:


978

Để áp dụng các lớp khác nhau khi các biểu thức khác nhau đánh giá true:

<div ng-class="{class1 : expression1, class2 : expression2}">
    Hello World!
</div>

Để áp dụng nhiều lớp khi một biểu thức giữ đúng:

<!-- notice expression1 used twice -->
<div ng-class="{class1 : expression1, class2 : expression1}">
    Hello World!
</div>

hoặc khá đơn giản:

<div ng-class="{'class1 class2' : expression1}">
    Hello World!
</div>

Lưu ý các trích dẫn duy nhất xung quanh các lớp css.


11
bạn không thể vượt qua nhiều lớp như ng-class = "{'class1 class2': biểu hiện1}" chỉ kiểm tra điều đó và hoàn toàn không hoạt động, giải pháp như @CodeHater nói "Để áp dụng nhiều lớp khi một biểu thức đúng:" điều đó đã đúng mánh khóe
d1jhoni1b

9
Trong 1.2.16, tùy chọn đa lớp ( 'class1 class2': expression) dường như hoạt động tốt, ngoại trừ việc nếu bạn sử dụng lại một lớp, nó sẽ bị loại bỏ khi biểu thức bật giữa các tùy chọn. Ví dụ với 'commonClass class1': expression == true, 'commonClass class2': expression == falsecommonClass bị mất khi biểu thức chuyển đổi giữa đúng và sai.
BrianS

10
@BrianS Tôi sẽ làm một cái gì đó như thế này:class="commonClass" ng-class={'class1' : expression, 'class2' : !expression}
Luôn luôn học hỏi

@CodeHater cảm ơn. Đó là khá nhiều những gì tôi đang lên kế hoạch bây giờ, chỉ cần dành một chút thời gian để sửa chữa CSS.
BrianS

ng-class="{'class1' : expression1, 'class2':expression1 }"thể không? Bạn có phiền khi nhìn vào Câu hỏi của tôi không: stackoverflow.com/questions/25391692/ từ
Nguy hiểm 14

48

Đối với ký hiệu toán tử ternary:

<div ng-class="expression1? 'class1 class2' : 'class3 class4'">

Điều này không làm việc cho tôi. <span ng-class = "params.isAdmin? 'fa fa-lock fa-2x': 'fa fa-unlock fa-2x'"> </ span>. Bảng điều khiển sẽ ném lỗi.
TommyQu

sử dụng phương pháp này, tôi có thể thêm một biểu thức khác không?
Hike Nalbandyan

6
@HikeNalbandyan vâng, bạn cũng có thể thêm một biểu thức khác:ng-class="[expression1? 'class1 class2' : 'class3 class4', expression2 ? 'class5' : 'class6']"
mahi-man

47

Có, bạn có thể có nhiều biểu thức để thêm nhiều lớp trong ng-class.

Ví dụ:

<div ng-class="{class1:Result.length==2,class2:Result.length==3}"> Dummy Data </div>

45

Một thay thế vô cùng mạnh mẽ cho các câu trả lời khác ở đây:

ng-class="[  { key: resulting-class-expression }[ key-matching-expression ], ..  ]"

Vài ví dụ:

1. Chỉ cần thêm 'class1 class2 class3' vào div:

<div ng-class="[{true: 'class1'}[true], {true: 'class2 class3'}[true]]"></div>

2. Thêm các lớp 'lẻ' hoặc 'chẵn' vào div, tùy thuộc vào chỉ mục $:

<div ng-class="[{0:'even', 1:'odd'}[ $index % 2]]"></div>

3. Tự động tạo một lớp cho mỗi div dựa trên chỉ mục $

<div ng-class="[{true:'index'+$index}[true]]"></div>

Nếu $index=5điều này sẽ dẫn đến:

<div class="index5"></div>

Đây là một mẫu mã bạn có thể chạy:

var app = angular.module('app', []); 
app.controller('MyCtrl', function($scope){
  $scope.items = 'abcdefg'.split('');
}); 
.odd  { background-color: #eee; }
.even { background-color: #fff; }
.index5 {background-color: #0095ff; color: white; font-weight: bold; }
* { font-family: "Courier New", Courier, monospace; }
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular.min.js"></script>

<div ng-app="app" ng-controller="MyCtrl">
  <div ng-repeat="item in items"
    ng-class="[{true:'index'+$index}[true], {0:'even', 1:'odd'}[ $index % 2 ]]">
    index {{$index}} = "{{item}}" ng-class="{{[{true:'index'+$index}[true], {0:'even', 1:'odd'}[ $index % 2 ]].join(' ')}}"
  </div>
</div>


2
Câu trả lời rực rỡ! Tôi đã luôn sử dụng các hàm cho các ng-classchỉ thị phức tạp hơn , chẳng hạn như khi tôi cần áp dụng một ternary và một biểu thức chuẩn trên cùng một phần tử. Tôi đã gửi một bản chỉnh sửa cho câu trả lời được chấp nhận để bao gồm việc sử dụng các mảng biểu thức.
Daniel Bonell

Tôi không phải là một chuyên gia Angular, nhưng dường như cấu trúc này: [{true:'index'+$index}[true], {0:'even', 1:'odd'}[ $index % 2 ]]có thể đơn giản hóa như thế này ['index'+$index, {0:'even', 1:'odd'}[ $index % 2 ]]. Tôi vừa thử nó trong Angular 1.5.9 và nó hoạt động :) Cảm ơn vì một câu trả lời tuyệt vời!
vadipp

30

Sử dụng một $scopephương thức trên bộ điều khiển, bạn có thể tính toán các lớp sẽ xuất ra trong khung nhìn. Điều này đặc biệt hữu ích nếu bạn có một logic phức tạp để tính toán tên lớp và nó sẽ giảm lượng logic trong chế độ xem của bạn bằng cách di chuyển nó đến bộ điều khiển:

app.controller('myController', function($scope) {

    $scope.className = function() {

        var className = 'initClass';

        if (condition1())
            className += ' class1';

        if (condition2())
            className += ' class2';

        return className;
    };
});

và theo quan điểm, chỉ cần:

<div ng-class="className()"></div>

1
Nếu lớp thay đổi sau khi kết xuất, lớp ng vẫn đang lắng nghe những thay đổi trong className?
lại

3
IMHO, phạm vi chỉ nên phơi bày điều kiện . Cần phải có các ng-ràng buộc HTML để xác định lớp nào sẽ sử dụng khi điều kiện đó được đáp ứng.
Alnitak

1
Điều này ghi đè lên thuộc tính lớp trong các phần tử dom. Nếu một người sử dụng điều này, họ phải bao gồm các lớp không cần điều kiện trong trả lại className.
phuwin

21

Ví dụ của bạn hoạt động cho các lớp có điều kiện (tên lớp sẽ hiển thị nếu expressionDataXđúng):

<div ng-class="{class1: expressionData1, class2: expressionData2}"></div>

Bạn cũng có thể thêm nhiều lớp, được cung cấp bởi người dùng của phần tử:

<div ng-class="[class1, class2]"></div>

Sử dụng:

<div class="foo bar" class1="foo" class2="bar"></div>


3
Bạn có biết nếu có thể kết hợp hai loại khuôn mẫu, tức là có một lớp có điều kiện sử dụng {}và một lớp ràng buộc dữ liệu bằng cách sử dụng []không?
JWG

3
Theo tôi biết thì không thể. Ngoài ra, không thể đặt hai ngClasschỉ thị trên một phần tử.
hiếm khi

Cảm ơn! Điều này dường như được xác nhận ở nơi khác.
JWG

2
bạn sẽ ngạc nhiên: <a href="#/u/[[msg.from]]" ng-bind="msg.from" class="name, ng-class:[users[msg.from].nice, users[msg.from].star];" ng-class="{premium: users[msg.from].premium}"></a>và hơn thế nữa: scotch.io/tutorials/javascript/the-many-ways-to-use-ng class
mayankcpdixit 6/12/14

1
@jwg: bạn có thể kết hợp hai loại mẫu ans ở đây: stackoverflow.com/questions/29230732/ Lời
satish kumar V

12

Dưới đây là một ví dụ so sánh nhiều trạng thái bộ định tuyến góc bằng OR | | nhà điều hành:

<li ng-class="
    {
        warning:
            $state.includes('out.pay.code.wrong')
            || $state.includes('out.pay.failed')
        ,
        active:
            $state.includes('out.pay')
    }
">

Nó sẽ cung cấp cho li các cảnh báo các lớp và / hoặc hoạt động, tùy thuộc vào việc các điều kiện có được đáp ứng hay không.


Tôi thực sự không thể nhớ. Nó không hợp lý mặc dù?
nitech

Cảm ơn bạn đã làm rõ rằng nhiều lớp có thể được áp dụng từ cùng một khối ng-class, miễn là mỗi điều kiện của chúng được thỏa mãn.
cedricdlb

6

Bên dưới active và activemenu là các lớp và itemCount và ShowCart là các giá trị biểu thức / boolean.

ng-class="{'active' : itemCount, 'activemenu' : showCart}"

5

Với nhiều điều kiện

<div ng-class="{'class1' : con1 || can2, 'class2' : con3 && con4}">
Hello World!
</div>

4

Tìm thấy một cách khác nhờ Scotch.io

<div ng-repeat="step in steps" class="step-container step" ng-class="[step.status, step.type]" ng-click="onClick(step.type)">

Đây là tài liệu tham khảo của tôi. CON ĐƯỜNG


3

Theo cách khác, chúng ta có thể tạo một hàm để điều khiển "sử dụng nhiều lớp"

CSS

 <style>
    .Red {
        color: Red;
    }
    .Yellow {
        color: Yellow;
    }
      .Blue {
        color: Blue;
    }
      .Green {
        color: Green;
    }
    .Gray {
        color: Gray;
    }
    .b {
         font-weight: bold;
    }
</style>

Kịch bản

<script>
    angular.module('myapp', [])
            .controller('ExampleController', ['$scope', function ($scope) {
                $scope.MyColors = ['It is Red', 'It is Yellow', 'It is Blue', 'It is Green', 'It is Gray'];
                $scope.getClass = function (strValue) {
                    if (strValue == ("It is Red"))
                        return "Red";
                    else if (strValue == ("It is Yellow"))
                        return "Yellow";
                    else if (strValue == ("It is Blue"))
                        return "Blue";
                    else if (strValue == ("It is Green"))
                        return "Green";
                    else if (strValue == ("It is Gray"))
                        return "Gray";
                }
        }]);
</script>

Sử dụng nó

<body ng-app="myapp" ng-controller="ExampleController">

<h2>AngularJS ng-class if example</h2>
<ul >
    <li ng-repeat="icolor in MyColors" >
        <p ng-class="[getClass(icolor), 'b']">{{icolor}}</p>
    </li>
</ul>

Bạn có thể tham khảo trang mã đầy đủ tại ng-class nếu ví dụ

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.