Menambahkan beberapa kelas menggunakan ng-class


542

Bisakah kita memiliki beberapa ekspresi untuk menambahkan beberapa kelas ng?

untuk mis.

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

Jika ya, adakah yang bisa memberikan contoh untuk melakukannya.

.


17
Contoh Anda berfungsi apa adanya.
Steve Klösters

Ya itu, saya hanya harus menggunakan! Penting dalam css agar terlihat. Saya menemukannya sendiri :)
Aditya Sethi

Apa yang dikatakan @stevuu .. is ri8 ... pertanyaanmu adalah answer
YaswanthJg

Apakah nilai expressionData1 biasanya mengambil true / false, atau sebenarnya nilai string?
Martian2049

Jawaban:


978

Untuk menerapkan kelas yang berbeda ketika ekspresi berbeda mengevaluasi untuk true:

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

Untuk menerapkan beberapa kelas saat ekspresi benar:

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

atau cukup sederhana:

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

Perhatikan tanda kutip tunggal seputar kelas css.


11
Anda tidak dapat melewati beberapa kelas seperti ng-class = "{'class1 class2': expression1}" hanya menguji itu dan tidak bekerja sama sekali, solusi seperti @CodeHater mengatakan "Untuk menerapkan beberapa kelas ketika sebuah ekspresi berlaku:" yang dibuat triknya
d1jhoni1b

9
Di 1.2.16 opsi multi-kelas ( 'class1 class2': expression) tampaknya berfungsi dengan baik, kecuali bahwa jika Anda menggunakan kembali kelas, itu akan dihapus ketika ekspresi beralih di antara opsi. Misalnya dengan 'commonClass class1': expression == true, 'commonClass class2': expression == falsecommonClass hilang ketika ekspresi berganti antara benar dan salah.
BrianS

10
@ Brian Saya akan melakukan sesuatu seperti ini:class="commonClass" ng-class={'class1' : expression, 'class2' : !expression}
AlwaysALearner

@ CodeHater terima kasih. Itulah yang saya rencanakan sekarang, hanya perlu mengambil waktu sejenak untuk memperbaiki CSS.
BrianS

Apakah ng-class="{'class1' : expression1, 'class2':expression1 }"mungkin? Maukah Anda melihat Pertanyaan saya: stackoverflow.com/questions/25391692/…
Danger14

48

Untuk notasi operator ternary:

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

Yang ini tidak bekerja untuk saya. <span ng-class = "params.isAdmin? 'fa fa-lock fa-2x': 'fa fa-unlock fa-2x'"> </span>. Konsol akan melempar kesalahan.
TommyQu

menggunakan metode ini, dapatkah saya menambahkan ekspresi lain?
Hike Nalbandyan

6
@HikeNalbandyan ya Anda dapat menambahkan ekspresi lain juga:ng-class="[expression1? 'class1 class2' : 'class3 class4', expression2 ? 'class5' : 'class6']"
mahi-man

47

Ya, Anda dapat memiliki beberapa ekspresi untuk menambahkan beberapa kelas dalam kelas ng.

Sebagai contoh:

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

45

Alternatif yang sangat kuat untuk jawaban lain di sini:

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

Beberapa contoh:

1. Cukup tambahkan 'class1 class2 class3' ke div:

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

2. Menambahkan kelas 'odd' atau 'even' ke div, tergantung pada $ index:

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

3. Secara dinamis membuat kelas untuk setiap div berdasarkan $ index

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

Jika $index=5ini menghasilkan:

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

Berikut contoh kode yang dapat Anda jalankan:

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
Jawaban yang brilian! Saya selalu menggunakan fungsi untuk ng-classarahan yang lebih kompleks , seperti ketika saya perlu menerapkan terner dan ekspresi standar pada elemen yang sama. Saya telah mengirimkan hasil edit ke jawaban yang diterima untuk menyertakan penggunaan array ekspresi.
Daniel Bonnell

Saya bukan ahli Angular, tapi sepertinya ini membangun: [{true:'index'+$index}[true], {0:'even', 1:'odd'}[ $index % 2 ]]dapat disederhanakan seperti ini ['index'+$index, {0:'even', 1:'odd'}[ $index % 2 ]]. Saya baru saja mencobanya di Angular 1.5.9 dan berhasil :) Terima kasih atas jawaban yang bagus!
vadipp

30

Menggunakan $scopemetode pada pengontrol, Anda bisa menghitung kelas apa yang akan ditampilkan dalam tampilan. Ini sangat berguna jika Anda memiliki logika kompleks untuk menghitung nama kelas dan itu akan mengurangi jumlah logika dalam tampilan Anda dengan memindahkannya ke controller:

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

    $scope.className = function() {

        var className = 'initClass';

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

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

        return className;
    };
});

dan dalam tampilan, cukup:

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

1
Jika kelas berubah setelah render, apakah kelas masih mendengarkan perubahan className?
remarsh

3
IMHO, ruang lingkup hanya memaparkan kondisi . Seharusnya tergantung pada ng-ikatan HTML untuk menentukan kelas apa yang digunakan ketika kondisi itu terpenuhi.
Alnitak

1
Ini menimpa atribut kelas dalam elemen dom. Jika seseorang menggunakan ini, mereka harus memasukkan kelas-kelas yang tidak membutuhkan kondisi dalam pengembalian className.
phuwin

21

Contoh Anda berfungsi untuk kelas terkondisi (nama kelas akan menunjukkan jika expressionDataXitu benar):

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

Anda juga dapat menambahkan beberapa kelas, yang disediakan oleh pengguna elemen:

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

Pemakaian:

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


3
Apakah Anda tahu apakah mungkin untuk menggabungkan dua jenis templat, yaitu menggunakan kelas bersyarat {}dan menggunakan data-terikat []?
jwg

3
Sejauh yang saya tahu itu tidak mungkin. Juga, tidak mungkin untuk menempatkan dua ngClassarahan pada suatu elemen.
seldary

Terima kasih! Ini sepertinya dikonfirmasi di tempat lain.
jwg

2
Anda akan terkejut: <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>dan banyak lagi: scotch.io/tutorials/javascript/the-many-ways-to-use-ngclass
mayankcpdixit

1
@ jwg: Anda dapat menggabungkan dua jenis templat dan ada di sini: stackoverflow.com/questions/29230732/…
satish kumar V

12

Berikut adalah contoh yang membandingkan beberapa status angular-ui-router menggunakan OR || operator:

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

Ini akan memberi li kelas peringatan dan / atau aktif, tergantung pada apakah kondisi terpenuhi.


Saya benar-benar tidak ingat. Bukankah ini logis?
nitech

Terima kasih telah menjelaskan bahwa beberapa kelas dapat diterapkan dari blok kelas yang sama, asalkan masing-masing kondisinya terpenuhi.
cedricdlb

6

Di bawah ini aktif dan activemenu adalah kelas dan itemCount dan ShowCart adalah nilai ekspresi / boolean.

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

5

Dengan berbagai kondisi

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

4

Menemukan cara lain berkat Scotch.io

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

Ini referensi saya. PATH


3

Cara lain kita dapat membuat fungsi untuk mengontrol "menggunakan beberapa kelas"

CSS

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

Naskah

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

Menggunakannya

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

Anda dapat merujuk ke halaman kode lengkap di kelas ng misalnya

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.