Sekarang bahwa perbedaan kinerja antara $broadcast
dan $emit
telah dieliminasi, apakah ada alasan untuk lebih memilih $scope.$emit
ke $rootScope.$broadcast
?
Mereka berbeda, ya.
$emit
terbatas pada hierarki lingkup (ke atas) - ini mungkin bagus, jika cocok dengan desain Anda, tetapi bagi saya sepertinya pembatasan yang agak sewenang-wenang.
$rootScope.$broadcast
bekerja di semua yang memilih untuk mendengarkan acara tersebut, yang merupakan batasan yang lebih masuk akal dalam pikiran saya.
Apakah saya melewatkan sesuatu?
EDIT:
Untuk mengklarifikasi sebagai jawaban atas jawaban, arah pengiriman bukanlah masalah yang saya cari. $scope.$emit
mengirim acara ke atas, dan $scope.$broadcast
- ke bawah. Tetapi mengapa tidak selalu digunakan $rootScope.$broadcast
untuk menjangkau semua pendengar yang dituju?
sumber
Jawaban:
tl; dr (tl; dr ini dari jawaban @ sp00m di bawah)
Penjelasan detail
$rootScope.$emit
hanya membiarkan$rootScope
pendengar lain menangkapnya. Ini bagus ketika Anda tidak ingin setiap orang$scope
mendapatkannya. Sebagian besar komunikasi tingkat tinggi. Anggap saja sebagai orang dewasa berbicara satu sama lain di sebuah ruangan sehingga anak-anak tidak dapat mendengar mereka.$rootScope.$broadcast
adalah metode yang memungkinkan hampir semua orang mendengarnya. Ini akan sama dengan orang tua yang berteriak bahwa makan malam sudah siap sehingga semua orang di rumah mendengarnya.$scope.$emit
adalah ketika Anda ingin itu$scope
dan semua orang tuanya dan$rootScope
mendengar acara tersebut. Ini adalah anak yang merengek kepada orang tua mereka di rumah (tetapi tidak di toko kelontong tempat anak-anak lain dapat mendengar).$scope.$broadcast
adalah untuk$scope
dirinya sendiri dan anak-anaknya. Ini adalah anak yang berbisik kepada boneka binatangnya sehingga orang tua mereka tidak bisa mendengar.sumber
$rootScope
siaran jika memungkinkan memungkinkan penggunaan kembali yang lebih baik.Mereka tidak melakukan pekerjaan yang sama:
$emit
mengirimkan acara ke atas melalui hierarki lingkup, sementara$broadcast
mengirimkan acara ke bawah ke semua cakupan anak.sumber
$rootScope
?Saya membuat gambar berikut dari tautan berikut: https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/
Seperti yang Anda lihat,
$rootScope.$broadcast
hit lebih banyak pendengar daripada$scope.$emit
.Juga,
$scope.$emit
efek menggelegak dapat dibatalkan, sedangkan$rootScope.$broadcast
tidak bisa.sumber
$ scope. $ emit: Metode ini mengirimkan peristiwa ke arah atas (dari anak ke orangtua)
$ scope. $ broadcast: Metode mengirimkan acara ke arah bawah (dari orangtua ke anak) ke semua pengontrol anak.
$ scope. $ on: Metode mendaftar untuk mendengarkan suatu acara. Semua pengendali yang mendengarkan acara itu mendapatkan pemberitahuan siaran atau memancarkan berdasarkan di mana mereka cocok dalam hirarki anak-orangtua.
Acara $ emit dapat dibatalkan oleh salah satu dari $ lingkup yang mendengarkan acara tersebut.
$ On menyediakan metode "stopPropagation". Dengan memanggil metode ini, acara dapat dihentikan dari penyebaran lebih lanjut.
Plunker: https://embed.plnkr.co/0Pdrrtj3GEnMp2UpILp4/
Dalam hal ruang lingkup saudara (ruang lingkup yang tidak dalam hirarki orangtua-anak langsung) maka $ emit dan $ broadcast tidak akan berkomunikasi dengan ruang lingkup saudara.
Untuk detail lebih lanjut silakan merujuk ke http://yogeshtutorials.blogspot.in/2015/12/event-based-communication-between-angularjs-controllers.html
sumber
@ Eddie telah memberikan jawaban sempurna dari pertanyaan yang diajukan. Tetapi saya ingin menarik perhatian untuk menggunakan pendekatan Pub / Sub yang lebih efisien.
Seperti yang disarankan oleh jawaban ini ,
Anda dapat menggunakan
angular-PubSub
modul sudut. setelah Anda menambahkanPubSub
modul ke ketergantungan aplikasi Anda, Anda dapat menggunakanPubSub
layanan untuk berlangganan dan berhenti berlangganan acara / topik.Mudah berlangganan:
Mudah diterbitkan
Untuk berhenti berlangganan, gunakan
PubSub.unsubscribe(sub);
ATAUPubSub.unsubscribe('event-name');
.CATATAN Jangan lupa berhenti berlangganan untuk menghindari kebocoran memori.
sumber
Gunakan RxJS dalam Layanan
Bangun layanan dengan RxJS Extensions for Angular .
Maka cukup berlangganan perubahan.
Klien dapat berlangganan perubahan dengan
DataService.subscribe
dan produsen dapat mendorong perubahan denganDataService.set
.The DEMO pada PLNKR .
sumber