Pertanyaan Angularjs pubsub vs $ broadcast


Saya telah membaca tentang acara yang lewat di Angularjs dan saya tidak yakin bahwa menggunakan $ broadcast adalah ide yang bagus.

Blog seperti ini satu advokat menjadi terbiasa dengan $ pada meskipun "merasa seperti berlebihan."

Kebingungan saya adalah bahwa implementasi menggunakan traversal kedalaman mendalam dari cakupan dan mencari pelanggan, yang membuat kecepatan acara Anda bergantung pada struktur pohon Anda. Berikut adalah beberapa kode dari yang secara bersudut:

// Insanity Warning: scope depth-first traversal
// yes, this code is a bit crazy, but it works and we have tests to prove it!
// this piece should be kept in sync with the traversal in $digest
if (!(next = (current.$$childHead || (current !== target && current.$$nextSibling)))) {
   while(current !== target && !(next = current.$$nextSibling)) {
     current = current.$parent;
   }
}

Selain itu, sepertinya Anda akan dapat meretas injeksi ketergantungan menggunakan metode ini.

Alternatifnya hanyalah sebuah layanan yang cache jenis acara dan callback, dan memanggil mereka secara langsung. Ini mengharuskan Anda membersihkan langganan untuk menghindari kebocoran.

Pertanyaan saya adalah, adakah yang saya rindukan tentang motivasi untuk $ broadcast / $ on paradigm? Atau apakah ada gunanya menggunakannya di pub yang lebih tradisional?

Beri tahu saya jika saya tidak cukup jelas dengan pertanyaan saya, dan terima kasih atas waktu Anda.


32
2018-02-07 21:59


asal


Jawaban:


Saya tidak berpikir Anda kehilangan sesuatu. Anda berhasil menguraikan pro / kontra dari masing-masing pendekatan.

Itu $broadcast/$on pendekatan tidak mengharuskan Anda untuk berhenti berlangganan, tetapi tidak terlalu efisien karena siaran ke semua cakupan. Ini juga memiliki penghalang yang sangat rendah untuk masuk. Anda tidak perlu menyuntikkan layanan apa pun, Anda tidak perlu membuatnya. Mereka disiarkan ke semua orang, jadi ini adalah pendekatan yang lebih sederhana.

Pendekatan pub / sub jauh lebih langsung. Hanya pelanggan yang mendapatkan acara, jadi tidak akan ada ruang lingkup di sistem untuk membuatnya berfungsi. Namun, ini lebih rumit karena Anda perlu menulis layanan Anda dengan penangan callback, dan Anda harus ingat untuk berhenti berlangganan. Mengenang berhenti berlangganan cukup besar menurut saya. Jika Anda tidak mendapatkan hak ini, Anda mendapatkan kebocoran memori. Dan Anda tidak akan mengetahuinya sampai menjadi masalah dalam 3 bulan.

Saya bisa melihat mengapa pendekatan built-in $broadcast.


18
2018-02-07 22:34



Saya melihat masalah yang sama ini. Khususnya bagaimana memungkinkan layanan untuk menyiarkan dan berlangganan acara tanpa mengakses $ rootScope (buruk karena beberapa alasan). Saya menggunakan implementasi sinyal-js yang sangat bagus dari sini: http://millermedeiros.github.io/js-signals/ dan membungkusnya ke dalam layanan sudut.

github intinya di sini: https://gist.github.com/anonymous/b552c7fafa77427e6d06


2
2018-03-05 20:11