Saya telah mendaftarkan pendengar saya ke acara $ broadcast menggunakan fungsi $ on
$scope.$on("onViewUpdated", this.callMe);
dan saya ingin membatalkan pendaftaran pendengar ini berdasarkan aturan bisnis tertentu. Tetapi masalah saya adalah bahwa setelah terdaftar saya tidak dapat membatalkan pendaftarannya.
Apakah ada metode di AngularJS untuk membatalkan pendaftaran pendengar tertentu? Metode seperti $ pada yang membatalkan pendaftaran acara ini, mungkin $ off. Jadi itu berdasarkan logika bisnis yang bisa saya katakan
$scope.$off("onViewUpdated", this.callMe);
dan fungsi ini berhenti dipanggil ketika seseorang menyiarkan acara "onViewUpdated".
Terima kasih
EDIT : Saya ingin membatalkan registrasi pendengar dari fungsi lain. Bukan fungsi tempat saya mendaftarkannya.
Jawaban:
Anda perlu menyimpan fungsi yang dikembalikan dan memanggilnya untuk berhenti berlangganan dari acara tersebut.
Ini ditemukan dalam kode sumber :) setidaknya di 1.0.4. Saya hanya akan memposting kode lengkap karena pendek
Juga, lihat dokumen .
sumber
Melihat sebagian besar balasan, mereka tampak terlalu rumit. Angular telah membangun mekanisme untuk membatalkan pendaftaran.
Gunakan fungsi deregistrasi yang dikembalikan oleh
$on
:sumber
$scope.$on
tidak harus dibatalkan secara manual$destroy
. Contoh yang lebih baik adalah menggunakan a$rootScope.$on
.Kode ini berfungsi untuk saya:
sumber
EDIT: Cara yang benar untuk melakukan ini ada di jawaban @ LiviuT!
Anda selalu dapat memperluas cakupan Angular untuk memungkinkan Anda menghapus pendengar seperti:
Dan inilah cara kerjanya:
Dan inilah penyedotnya dalam aksi
sumber
Setelah men-debug kode, saya membuat fungsi saya sendiri seperti jawaban "blesh". Jadi ini yang saya lakukan
jadi dengan melampirkan fungsi saya ke $ rootscope sekarang ini tersedia untuk semua pengontrol saya.
dan dalam kode saya yang saya lakukan
Terima kasih
EDIT: Cara AngularJS untuk melakukan ini adalah dalam jawaban @ LiviuT! Tetapi jika Anda ingin membatalkan registrasi pendengar di lingkup lain dan pada saat yang sama ingin menjauh dari membuat variabel lokal untuk menyimpan referensi fungsi de-registrasi. Ini adalah solusi yang memungkinkan.
sumber
@ LiviuT jawabannya luar biasa, tetapi sepertinya membuat banyak orang bertanya-tanya bagaimana cara mengakses kembali fungsi runtuh handler dari $ scope atau fungsi lain, jika Anda ingin menghancurkannya dari tempat lain selain dari tempat ia dibuat. @ Рустем Мусабеков Jawabannya bekerja dengan baik, tetapi tidak terlalu idiomatis. (Dan bergantung pada apa yang seharusnya menjadi detail implementasi pribadi, yang dapat berubah sewaktu-waktu.) Dan dari sana, semakin rumit ...
Saya pikir jawaban yang mudah di sini adalah dengan hanya membawa referensi ke fungsi tear-down (
offCallMeFn
dalam contohnya) di handler itu sendiri, dan kemudian menyebutnya berdasarkan beberapa kondisi; mungkin argumen yang Anda sertakan pada acara yang Anda $ broadcast atau $ emit. Dengan demikian, penangan dapat menghancurkan diri mereka sendiri, kapan pun Anda mau, di mana pun Anda inginkan, membawa benih kehancuran mereka sendiri. Seperti itu:Dua pemikiran:
selfDestruct
segera setelah ia menyelesaikan misi bunuh diri.sumber
Daftarkan pengait untuk berhenti berlangganan pendengar Anda ketika komponen dihapus:
sumber
Jika Anda perlu menghidupkan dan mematikan pendengar beberapa kali, Anda dapat membuat fungsi dengan
boolean
parametersumber
'$ on' sendiri mengembalikan fungsi untuk tidak mendaftar
Anda dapat memanggil fungsi unregister () untuk membatalkan registrasi pendengar itu
sumber
Salah satu caranya adalah menghancurkan pendengar begitu Anda selesai.
sumber