Neden AngularJS'de $ rootScope. $ Broadcast kullanıyoruz?


109

AngularJS için bazı temel bilgiler bulmaya çalıştım $rootScope.$broadcast, ancak AngularJS belgeleri pek yardımcı olmuyor. Basit bir deyişle, bunu neden kullanıyoruz?

Ayrıca, John Papa'nın Sıcak Havlu şablonunun içinde şu adla anılan ortak modülde özel bir işlev vardır $broadcast:

function $broadcast() {
    return $rootScope.$broadcast.apply($rootScope, arguments);
}

Bunun ne yaptığını anlamadım. İşte birkaç temel soru:

1) Ne yapar $rootScope.$broadcast?

2) $rootScope.$broadcastve arasındaki fark nedir $rootScope.$broadcast.apply?




$rootScope.$broadcast.apply()özel argumentsnesneyi başka bir işleve geçirmek istiyorsanız apply()(yerine call()) kullanmanız gerektiğinden kullanılır . @ Blackhole'un uygulandığında MDN sayfasına olan bağlantısına ek olarak, adresindeki girişi de kontrol edebilirsiniz arguments.
Scott Schupbach

Yanıtlar:


97
  1. Ne anlama geliyor $rootScope.$broadcast?

    $rootScope.$broadcastuygulama kapsamı üzerinden bir olay gönderiyor. Söz konusu uygulamanın tüm çocuklara kapsamı basit kullanarak yakalayabilirsiniz: $scope.$on().

    Doğrudan bir üst öğe olmayan bir kapsama ulaşmak istediğinizde olayları göndermek özellikle yararlıdır (örneğin, bir üst kuruluşun bir dalı)

    !!! Ancak yapılmaması gereken bir şey $rootScope.$on, bir denetleyiciden kullanmaktır . $rootScopeBu uygulama, denetleyiciniz yok edildiğinde, olay dinleyicisi hala var olacak ve denetleyiciniz yeniden oluşturulduğunda, yalnızca daha fazla olay dinleyicisi biriktirecektir. (Yani bir yayın birden çok kez yakalanacaktır). $scope.$on()Bunun yerine kullanın ve dinleyiciler de yok edilecektir.

  2. Arasındaki fark nedir $rootScope.$broadcast& $rootScope.$broadcast.apply?

    Bazen apply(), özellikle yönergeler ve diğer JS kitaplıklarıyla çalışırken kullanmanız gerekir . Ancak bu kod tabanını bilmediğim için, buradaki durumun bu olup olmadığını anlayamam.


11
$rootScope.$onBellek sızıntısında harika bir yakalama . Bu, kontrolörler muhtemelen hiEventServiceyarattığı cevabı arayacağından, kabul edilen cevap için de geçerlidir .
adamdport

Ne kullanırsınız bir örnektir $broadcastvs$broadcast.apply()
Konuk

$ rootScope. $ broadcast olayı sadece alt kapsamlardan gelen dinleyicilere değil tüm dinleyicilere gönderir. $ kapsam. $ yayın, etkinliği alt kapsamlarla sınırlar
Geert Bellemans

157

$rootScope temelde bir olay dinleyicisi ve dağıtıcısı olarak işlev görür.

Nasıl kullanıldığı sorusuna cevap vermek için rootScope.$on;

$rootScope.$broadcast("hi");

$rootScope.$on("hi", function(){
    //do something
});

Bununla birlikte, $rootScopeher uygulamanın $ rootScope'a bağlı olduğu bir duruma hızlı bir şekilde ulaşacağınız ve hangi bileşenlerin hangi olayları dinlediğini bilmediğiniz için kendi uygulamanızın genel etkinlik hizmeti olarak kullanmak kötü bir uygulamadır .

En iyi uygulama, dinlemek veya yayınlamak istediğiniz her özel etkinlik için bir hizmet oluşturmaktır.

.service("hiEventService",function($rootScope) {
    this.broadcast = function() {$rootScope.$broadcast("hi")}
    this.listen = function(callback) {$rootScope.$on("hi",callback)}
})

4
Teşekkürler @itcouldevenbeabout bu satır, global $ rootScope'a bir olay eklemekle aynı mantığı çağırmıyor mu? function () {$ rootScope. $ yayın ("merhaba")}, bahsettiğiniz kötü bir uygulama mı?
Nexus23

11
Yayın yapmak için bir hizmet kullanmak ve ayrıca belirli bir olay için dinleyicileri eklemek, kimin dinlediğinden emin olmadığınız durumlardan kaçınır. Hangi bileşenlerin bağımlılık olarak etkinlik hizmetine sahip olduğu belli oluyor
CoolTapes

4
$ Emit ve $ yayını arasındaki farkı yeni keşfettiğimde, olayı $ yaymanın daha iyi olacağını söylemeye meyilli olurum - bu şekilde, olayı mümkün olan en küçük kapsam kümesinde kirleten olayı (ideal olarak hizmetin kendi kapsamı, ama bunun mümkün olduğunu sanmıyorum?)
Brondahl

3
-1. Bir hizmetteki izolasyonun basitçe yayın yapmaktan daha iyi olduğunu anlamıyorum. Her neyse, hizmette kendi özel kapsamınızı daha iyi kullanın. Ve $ yayın yerine $ emit kullansanız iyi olur. Ayrıca önerilen hizmetiniz olay argümanlarını desteklemiyor. Daha kötüsü abonelikten çıkmayı desteklemiyor; $ rootScope için ölümcül bir günah.
alpha-mouse

3
Aboneliğin iptal edilmemesi bu cevabı benim için mahvediyor. hiEventService.listen(callback)Bir denetleyiciden çağırırsanız , denetleyici yok edildikten sonra bile dinleyici var olmaya devam eder. Bellek sızıntısı! Denetleyici kapsamına bağlama $scope.$on("hi",callback), otomatik temizleme ile birlikte gelir.
adamdport

32

$ rootScope. $ broadcast , tüm alt kapsamların dinleyebileceği "global" bir olay oluşturmanın uygun bir yoludur. $rootScopeTüm alt kapsamlar onu dinleyebileceği için mesajı yayınlamak için kullanmanız yeterlidir .

Kök kapsam, olayı yayınlar:

$rootScope.$broadcast("myEvent");

Herhangi bir alt Kapsam, etkinliği dinleyebilir:

$scope.$on("myEvent",function () {console.log('my event occurred');} );

Neden $ rootScope. $ Broadcast kullanıyoruz? $watchDeğişken değişiklikleri dinlemek ve değişken durumu değiştiğinde işlevleri yürütmek için kullanabilirsiniz . Ancak, bazı durumlarda, kapsam değişkeni durumundaki herhangi bir değişiklikten bağımsız olarak, uygulamanın diğer bölümlerinin dinleyebileceği bir olay ortaya çıkarmak istersiniz. Bu ne zaman $broadcastyardımcı olur.


19

Veri aktarımı !!!

Bir geri arama işlevi kullanarak alınacak $broadcastbir parametreyi geçirebileceğiniz bir parametreyi neden kabul etmediğini merak ediyorum.Object$on

Misal:

// the object to transfert
var myObject = {
    status : 10
}

$rootScope.$broadcast('status_updated', myObject);
$scope.$on('status_updated', function(event, obj){
    console.log(obj.status); // 10
})

8

$ RootScope. $ Broadcast ne yapar?

Mesajı, açısal uygulamanın her yerinde ilgili dinleyicilere yayınlar, mesajları farklı hiyerarşik seviyedeki kapsamlara aktarmak için çok güçlü bir yoldur (ebeveyn, çocuk veya kardeşler)

Benzer şekilde, $ rootScope. $ Emit var, tek fark, birincisinin de $ kapsam tarafından yakalanmasıdır. $ On, ikincisi yalnızca $ rootScope. $ On tarafından yakalanır.

örnekler için bakın: - http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.