Próbowałem znaleźć podstawowe informacje o AngularJS $rootScope.$broadcast
, ale dokumentacja AngularJS niewiele pomaga. W prostych słowach, dlaczego tego używamy?
Ponadto w szablonie Hot Towel Johna Papy znajduje się niestandardowa funkcja we wspólnym module o nazwie $broadcast
:
function $broadcast() {
return $rootScope.$broadcast.apply($rootScope, arguments);
}
Nie rozumiem, co to robi. Oto kilka podstawowych pytań:
1) Co robi $rootScope.$broadcast
?
2) Jaka jest różnica między $rootScope.$broadcast
i $rootScope.$broadcast.apply
?
$rootScope.$broadcast.apply()
jest używany, ponieważ jeśli chcesz przekazać specjalnyarguments
obiekt do innej funkcji, musisz go użyćapply()
(w przeciwieństwie docall()
). Oprócz linku @ Blackhole do strony MDN w aplikacji, możesz również sprawdzić wpis naarguments
.Odpowiedzi:
Co robi
$rootScope.$broadcast
?$rootScope.$broadcast
wysyła zdarzenie za pośrednictwem zakresu aplikacji. Wszelkie dzieci zakres tej aplikacji można złapać go za pomocą prostego:$scope.$on()
.Jest to szczególnie przydatne do wysyłania zdarzeń, gdy chcesz dotrzeć do zakresu, który nie jest bezpośrednim rodzicem (na przykład gałąź rodzica)
!!! Jedną rzeczą, której nie należy robić, jest jednak korzystanie
$rootScope.$on
z kontrolera.$rootScope
jest aplikacją, kiedy twój kontroler zostanie zniszczony, ten detektor zdarzeń będzie nadal istniał, a kiedy twój kontroler zostanie utworzony ponownie, po prostu zgromadzi więcej detektorów zdarzeń. (Tak więc jedna transmisja zostanie przechwycona wiele razy). Użyj$scope.$on()
zamiast tego, a słuchacze również zostaną zniszczeni.Jaka jest różnica między
$rootScope.$broadcast
&$rootScope.$broadcast.apply
?Czasami trzeba go używać
apply()
, zwłaszcza podczas pracy z dyrektywami i innymi bibliotekami JS. Jednak ponieważ nie znam tej bazy kodu, nie byłbym w stanie powiedzieć, czy tak jest w tym przypadku.źródło
$rootScope.$on
wycieku pamięci. Dotyczy to również zaakceptowanej odpowiedzi, ponieważ kontrolerzy prawdopodobnie będą wywoływaćhiEventService
utworzoną przez siebie odpowiedź.$broadcast
$broadcast.apply()
$rootScope
zasadniczo działa jako detektor i dyspozytor zdarzeń.Aby odpowiedzieć na pytanie, jak jest używany, używamy go w połączeniu z
rootScope.$on
;Jednak używanie
$rootScope
jako ogólnej usługi zdarzeń własnej aplikacji jest złą praktyką , ponieważ szybko znajdziesz się w sytuacji, w której każda aplikacja zależy od $ rootScope i nie wiesz, jakie komponenty nasłuchują jakich zdarzeń.Najlepszą praktyką jest utworzenie usługi dla każdego wydarzenia niestandardowego, którego chcesz słuchać lub transmitować.
źródło
hiEventService.listen(callback)
z kontrolera, słuchacz będzie nadal istniał nawet po zniszczeniu kontrolera. Wyciek pamięci! Powiązanie z zakresem kontrolera$scope.$on("hi",callback)
obejmuje automatyczne czyszczenie.$ rootScope. $ broadcast to wygodny sposób na wywołanie zdarzenia „globalnego”, którego mogą nasłuchiwać wszystkie zasięgi potomne. Musisz użyć tylko
$rootScope
do rozgłaszania wiadomości, ponieważ wszystkie zakresy podrzędne mogą go nasłuchiwać.Zakres główny rozgłasza zdarzenie:
Każde dziecko Scope może nasłuchiwać zdarzenia:
Dlaczego używamy $ rootScope. $ Broadcast? Możesz użyć
$watch
do nasłuchiwania zmian zmiennych i wykonywania funkcji, gdy zmienia się stan zmiennej. Jednak w niektórych przypadkach po prostu chcesz zgłosić zdarzenie, którego mogą nasłuchiwać inne części aplikacji, niezależnie od jakiejkolwiek zmiany stanu zmiennej zakresu. Wtedy jest$broadcast
to pomocne.źródło
Przekazywanie danych !!!
Zastanawiam się, dlaczego nikt nie wspomniał, że
$broadcast
akceptują parametr, w którym można przekazać,Object
który zostanie odebrany za$on
pomocą funkcji zwrotnejPrzykład:
źródło
Co robi $ rootScope. $ Broadcast?
Rozgłasza wiadomość do odpowiednich słuchaczy w całej aplikacji kątowej, bardzo potężny środek do przesyłania wiadomości do zakresów na różnych poziomach hierarchii (czy to rodzic, dziecko czy rodzeństwo)
Podobnie, mamy $ rootScope. $ Emit, jedyną różnicą jest to, że pierwsza jest również przechwytywana przez $ scope. $ On, podczas gdy druga jest przechwytywana tylko przez $ rootScope. $ On.
zobacz przykłady: - http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/
źródło