AngularJS beralih kelas menggunakan ng-class

217

Saya mencoba untuk beralih kelas menggunakan elemen 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;
}

Pada dasarnya, jika $scope.autoScrollitu benar, saya ingin menjadi kelas ng icon-autoscrolldan jika itu salah, saya menginginkannyaicon-autoscroll-disabled

Apa yang saya miliki sekarang tidak berfungsi dan menghasilkan kesalahan ini di konsol

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

Bagaimana saya melakukan ini dengan benar?

EDIT

solusi 1: (ketinggalan jaman)

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

EDIT 2

solusi 2:

Saya ingin memperbarui solusi karena Solution 3, yang disediakan oleh Stewie, harus menjadi yang digunakan. Ini adalah yang paling standar ketika datang ke operator ternary (dan bagi saya paling mudah dibaca). Solusinya adalah

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

diterjemahkan menjadi:

if (autoScroll == true) ?// gunakan kelas 'icon-autoscroll' :// gunakan lagi'icon-autoscroll-disabled'

Ronnie
sumber
tidak dapat menggunakan kondisional dalam angular expressionsper dokumen => Tidak Ada Pernyataan Aliran Kontrol: Anda tidak dapat melakukan hal-hal berikut dalam ekspresi sudut: conditional, loop, atau throw. Gunakan fungsi atau arahan lain
charlietfl
@ Connie, saya melihat solusi Anda, dan itu sangat keren. tapi saya bertanya-tanya mengapa di autoScrollsini hanya akan berpengaruh di setiap tombol? (Saya menguji ini dengan beberapa tombol, dan itu bekerja dengan baik juga) Maksud saya, ketika saya mengklik setiap tombol, efeknya hanya tombol itu, bukan semua tombol.
zx1986

Jawaban:

436

Cara menggunakan conditional di ng-class:

Solusi 1:

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

Solusi 2:

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

Solusi 3 (angular v.1.1.4 + memperkenalkan dukungan untuk operator ternary):

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

Plunker

Stewie
sumber
3
Contoh kedua adalah pembersih, tetapi konyol bahwa Anda tidak dapat menempatkan variabel yang Anda evaluasi di depan ekspresi ... itu hanya berbunyi lucu. Bayangkan melihat ekspresi sebagai pernyataan if: "if (variabel) true: do this, false: do that ... ugh #fullynerdy
mattdlockyer
10
@Stewie Faaakin sobat cantik, suka tampilannya seperti kode sungguhan dan bukan markup ekspresi bastardized: D
mattdlockyer
Sebenarnya mengevaluasi nilai terlebih dahulu cukup berguna karena tidak sengaja memberikan nilai baru pada variabel.
lharby
Ternary adalah apa yang saya cari. Pekerjaan bagus memberikan tiga contoh dengan detail dukungan versi.
TaeKwonJoe
13

Sebagai solusi alternatif, berdasarkan operator logika javascript '&&' yang mengembalikan evaluasi terakhir, Anda juga dapat melakukannya seperti ini:

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

Ini hanya sintaks yang sedikit lebih pendek, tetapi bagi saya lebih mudah dibaca.

Lukus
sumber
10

Tambahkan lebih dari satu kelas berdasarkan kondisi:

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

Terapkan: class1 + class2 + class3 ketika isNew = false ,

Terapkan: class1 + class4 ketika isNew = true

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

Analog dengan toggleClassmetode jQuery , ini adalah cara untuk mengaktifkan active/ menonaktifkan kelas ketika elemen diklik.

Pavel Levin
sumber
2
Bisakah Anda memberikan beberapa informasi lebih lanjut tentang jawaban Anda dalam bahasa Inggris? Apa bedanya dengan jawaban yang sudah ada di sini?
Onots
2
Saya tidak yakin mengapa jawaban ini memiliki banyak suara negatif ?? Ini adalah solusi yang benar-benar bekerja lebih baik untuk saya daripada yang lain di atas ...
Paulo Griiettner
2
Saya pikir deskripsinya ditulis dengan buruk dan orang bereaksi terhadap kata "jQuery". Apa yang ingin dikatakan oleh deskripsi adalah "Ini analog dengan fungsi toggleClass di JQuery". BTW, apakah Anda perlu init variabel?
Desain oleh Adrian
1

autoscroll akan didefinisikan dan dimodifikasi dalam pengontrol.

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

Tambahkan beberapa kelas berdasarkan kondisi dengan:

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

Celana Harshit
sumber
-1

Saya membuat ini bekerja dengan cara ini:

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

// di controller Anda

 $scope.toggleClass = function (event){
        $(event.target).toggleClass('active');
    }
Ruhul Amin
sumber
2
Sementara itu berhasil, Anda mencampur sudut dan jQuery. Anda harus mencoba dan menghindari itu jika Anda bisa. Apa yang awalnya diminta dapat dilakukan tanpa acara klik. Bagaimana jika Anda memiliki tombol lain yang seharusnya mengaktifkan kelas ini pada tombol Anda di atas? Itu tidak akan diperbarui sekarang karena Anda mengubahnya pada klik dan bukan melalui ng-class
Ronnie
1
Ini dari jqLite. Untuk lebih banyak docs.angularjs.org/api/ng/function/angular.element
Ruhul Amin
1
Saya mengerti. Maksud saya adalah Anda tidak perlu menggunakan jQuery apa pun untuk mencapai jawaban atas pertanyaan awal.
Ronnie