Bagaimana cara membuat acara ng-click bersyarat?

115

Saya memiliki kode ini di dalam ng-repeat:

<a href="#" class="disabled" ng-click="doSomething(object)">Do something</a>

Bagaimana cara membuat kondisi bahwa tombol dinonaktifkan class="disabled"?

Atau adakah cara melakukannya dalam Javascript sehingga akan terlihat seperti:

$('.do-something-button').click(function(){
  if (!$(this).hasClass('disabled')) {
    do something
  }
});
Alon
sumber

Jawaban:

205

Tidak baik untuk memanipulasi dengan DOM (termasuk memeriksa atribut) di sembarang tempat kecuali arahan. Anda dapat menambahkan beberapa nilai ke dalam cakupan yang menunjukkan jika link harus dinonaktifkan.

Tetapi masalah lainnya adalah ngDisabled tidak berfungsi pada apa pun kecuali kontrol formulir, jadi Anda tidak dapat menggunakannya dengan <a>, tetapi Anda dapat menggunakannya dengan <button> dan menatanya sebagai tautan.

Cara lain adalah dengan menggunakan evaluasi lazy dari ekspresi seperti isDisabled || action()sehingga tindakan tidak akan dipanggil jika isDisabledbenar.

Ini dia kedua solusi tersebut: http://plnkr.co/edit/5d5R5KfD4PCE8vS3OSSx?p=preview

Valentyn Shybanov
sumber
67
jadi untuk menyimpulkan: ng-click = "isDisabled || action ()" berhasil
Alon
27
lebih baik: ||seharusnya &&, meskipun berfungsi di plunk Anda, jika isDisabled adalah metode pipa ganda terus memeriksa ekspresi yang valid. Ini tidak terjadi dengan&&
polyclick
7
@polyclick logika kemudian akan berubah juga. jika isDisabled mengembalikan nilai true, maka action () akan dipanggil.
UCJava
@polyclick: Tapi intinya adalah jangan terus memeriksa jika dinonaktifkan. Plus, dalam versi Anda, jika isDisabled()mengembalikan salah, tidak ada yang akan action()dipanggil, dan pemeriksaan "untuk ekspresi yang valid" juga tidak dilanjutkan.
Sebastian Mach
1
@UCJava, jika && digunakan, maka akan! IsDisabled (atau isEnabled). Bisa ng-click = "Form. $ Valid && action ()" atau ng-click = "Form. $ Invalid || action ()"
Weihui Guo
47

Kita bisa menambahkan event ng-click secara kondisional tanpa menggunakan kelas yang dinonaktifkan.

HTML:

<div ng-repeat="object in objects">
<span ng-click="!object.status && disableIt(object)">{{object.value}}</span>
</div>
Rubi saini
sumber
7

Saya menggunakan ekspresi && yang bekerja dengan sempurna untuk saya.

Sebagai contoh,

<button ng-model="vm.slideOneValid" ng-disabled="!vm.slideOneValid" ng-click="vm.slideOneValid && vm.nextSlide()" class="btn btn-light-green btn-medium pull-right">Next</button>

Jika vm.slideOneValidsalah, bagian kedua dari ekspresi tidak diaktifkan. Saya tahu ini memasukkan logika ke DOM, tetapi ini cara cepat yang kotor untuk menonaktifkan ng dan ng-klik untuk menempatkannya dengan baik.

Ingatlah untuk menambahkan ng-model ke elemen agar ng-nonaktif bekerja.

Nick Res
sumber
4

Pada dasarnya ng-clickpertama-tama memeriksa isDisableddan berdasarkan nilainya itu akan memutuskan apakah fungsi harus dipanggil atau tidak.

<span ng-click="(isDisabled) || clicked()">Do something</span>

ATAU baca sebagai

<span ng-click="(if this value is true function clicked won't be called. and if it's false the clicked will be called) || clicked()">Do something</span>
Pemula
sumber
1

Anda bisa mencoba menggunakan ng-class.
Berikut adalah contoh sederhana saya:
http://plnkr.co/edit/wS3QkQ5dvHNdc6Lb8ZSF?p=preview

<div ng-repeat="object in objects">
  <span ng-class="{'disabled': object.status}" ng-click="disableIt(object)">
    {{object.value}}
  </span>
</div>

Status adalah atribut khusus dari objek, Anda dapat menamainya apa pun yang Anda inginkan.
The disableddalam ng-classadalah nama kelas CSS, yang object.statusharus trueataufalse

Anda dapat mengubah setiap status objek dalam fungsi disableIt.
Di Kontroler Anda, Anda dapat melakukan ini:

$scope.disableIt = function(obj) {
  obj.status = !obj.status
}
zx1986
sumber
1

Saya juga mengalami masalah ini dan saya baru tahu bahwa jika Anda menghapus "#", masalah tersebut akan hilang. Seperti ini :

<a href="" class="disabled" ng-click="doSomething(object)">Do something</a>
pollux1er
sumber
hrefsebaiknya tidak digunakan, gunakan ng-hrefsaja.
Felipe Alarcon
3
@Felipe Alarcon ng-hrefhanya diperlukan ketika Anda perlu menghitung jalur secara dinamis. Jika jalannya tidak pernah berubah, hreftidak masalah.
Ravvy