Ini sebuah contoh. Katakanlah saya ingin memiliki hamparan gambar seperti banyak situs. Jadi ketika Anda mengklik thumbnail, overlay hitam muncul di seluruh jendela Anda, dan versi gambar yang lebih besar berada di tengahnya. Mengklik overlay hitam mengabaikannya; mengklik gambar akan memanggil fungsi yang menampilkan gambar berikutnya.
Html:
<div ng-controller="OverlayCtrl" class="overlay" ng-click="hideOverlay()">
<img src="http://some_src" ng-click="nextImage()"/>
</div>
Javascript:
function OverlayCtrl($scope) {
$scope.hideOverlay = function() {
// Some code to hdie the overlay
}
$scope.nextImage = function() {
// Some code to find and display the next image
}
}
Masalahnya adalah bahwa dengan pengaturan ini, jika Anda mengklik gambar, keduanya nextImage()
dan hideOverlay()
dipanggil. Tetapi yang saya inginkan hanyalah nextImage()
dipanggil.
Saya tahu Anda dapat menangkap dan membatalkan acara dalam nextImage()
fungsi seperti ini:
if (window.event) {
window.event.stopPropagation();
}
... Tapi saya ingin tahu apakah ada cara AngularJS yang lebih baik untuk melakukannya yang tidak mengharuskan saya untuk awalan semua fungsi pada elemen di dalam overlay dengan cuplikan ini.
return false
di akhir acaraonclick
, bukanng-click
.Jawaban:
Apa yang dikatakan @JosephSilber, atau meneruskan objek $ event ke dalam
ng-click
callback dan menghentikan propagasi di dalamnya:sumber
Gunakan
$event.stopPropagation()
:Berikut ini demo: http://plnkr.co/edit/3Pp3NFbGxy30srl8OBmQ?p=preview
sumber
ReferenceError: $event is not defined
konsol.$event.stopPropagation()
di tempat yang tidak berfungsi. Lupa menghapusnya. Jadi, bahkan ketika saya meletakkannya di tempat yang benar-benar berfungsi, itu disebut untuk yang kedua kalinya. Menyingkirkan duplikat yang disfungsional dan berhasil. Terima kasih atas bantuan Anda.Saya suka ide menggunakan arahan untuk ini:
Kemudian gunakan direktif seperti:
Jika Anda mau, Anda bisa menjadikan solusi ini lebih umum seperti jawaban ini untuk pertanyaan yang berbeda: https://stackoverflow.com/a/14547223/347216
sumber
stop-event
atribut html? Saya tidak dapat menemukannya di Jaringan Pengembang Mozilla atau di mana pun.angular-eat-event
arahan pada bower, yang bekerja dengan cara yang sama!Terkadang, mungkin paling masuk akal untuk melakukan ini:
Saya memilih untuk melakukannya dengan cara ini karena saya tidak ingin
myClickHandler()
menghentikan penyebaran acara di banyak tempat lain yang digunakan.Tentu, saya bisa menambahkan parameter boolean ke fungsi handler, tetapi
stopPropagation()
jauh lebih bermakna dari sekedartrue
.sumber
$event.stopPropagation()
elemen internal.checkbox
dibungkusdiv
elemen. Sayadiv
mengambil 12 kolom dancheckbox
mengatakan 3 kolom. Saya ingin memanggil fungsiA
pada klikdiv
dan fungsiB
pada klikcheckbox
. jadi ketika saya mengklikcheckbox
kedua fungsi itu dipanggil. Ketika saya menambahkanng-click="$event.stopPropagation()"
kecheckbox
, aku hanya fungsiB
dipanggil.stopPropagation()
adalah menghentikan acara yang menyebar ke elemen induk. Saya tidak yakin bagaimana Anda menyebutnyaB
karena itu tidak ditetapkan dalamng-click
, tapi titik jawabannya adalah bahwa Anda dapat melakukan ini:<checkbox ng-click="B(); $event.stopPropagation()">
. Anda tidak harus memasukkanstopPropagation()
fungsi ke dalamB
.Ini bekerja untuk saya:
sumber
Jika Anda tidak ingin harus menambahkan berhenti propagasi ke semua tautan ini berfungsi juga. Sedikit lebih scalable.
sumber
event.target.classList.indexOf('overlay')
Dan trik itu berfungsi dengan baik bahkan ketika div bersarang di div lainJika Anda memasukkan ng-klik = "$ event.stopPropagation" pada elemen induk dari templat Anda, stopPropogation akan ketahuan saat gelembung naik ke pohon, jadi Anda hanya perlu menulisnya sekali untuk seluruh templat Anda.
sumber
Anda dapat mendaftarkan arahan lain di atas
ng-click
yang mengubah perilaku defaultng-click
dan menghentikan propagasi acara. Dengan cara ini Anda tidak perlu menambahkan$event.stopPropagation
dengan tangan.sumber
DI pengontrol digunakan
sumber