Teraz, że różnica wydajności pomiędzy $broadcast
i $emit
została wyeliminowana, nie ma żadnych powodów, aby wolą $scope.$emit
się $rootScope.$broadcast
?
Są różne, tak.
$emit
jest ograniczona do hierarchii zakresu (w górę) - może to być dobre, jeśli pasuje do twojego projektu, ale wydaje mi się to dość arbitralnym ograniczeniem.
$rootScope.$broadcast
działa we wszystkich, którzy zdecydują się słuchać tego wydarzenia, co jest bardziej rozsądnym ograniczeniem w mojej opinii.
Czy coś brakuje?
EDYTOWAĆ:
Aby wyjaśnić w odpowiedzi na odpowiedź, nie chodzi o kierunek wysyłki. $scope.$emit
wywołuje zdarzenie w górę, i $scope.$broadcast
- w dół. Ale dlaczego nie zawsze $rootScope.$broadcast
docierać do wszystkich zamierzonych słuchaczy?
angularjs
angularjs-scope
New Dev
źródło
źródło
Odpowiedzi:
tl; dr (ten tl; dr pochodzi z odpowiedzi @ sp00m poniżej)
Szczegółowe wyjaśnienie
$rootScope.$emit
pozwala tylko innym$rootScope
słuchaczom go złapać. Jest to dobre, gdy nie chcesz,$scope
aby każdy to otrzymał. Przeważnie komunikacja na wysokim poziomie. Pomyśl o tym, jak dorośli rozmawiają ze sobą w pokoju, aby dzieci ich nie słyszały.$rootScope.$broadcast
to metoda, która pozwala usłyszeć prawie wszystko. Byłoby to odpowiednikiem krzyku rodziców, że obiad jest gotowy, więc wszyscy w domu to słyszą.$scope.$emit
jest to, kiedy chcesz tego$scope
i wszystkich jego rodziców i$rootScope
usłyszeć wydarzenie. To dziecko narzeka na rodziców w domu (ale nie w sklepie spożywczym, w którym słyszą inne dzieci).$scope.$broadcast
jest dla$scope
siebie i swoich dzieci. To dziecko szepcze pluszowym zwierzakom, żeby ich rodzice nie słyszeli.źródło
$rootScope
transmisji tam, gdzie to możliwe, umożliwia lepsze ponowne wykorzystanie.Nie wykonują tego samego zadania:
$emit
wywołują zdarzenie w górę poprzez hierarchię zasięgu, a$broadcast
zdarzenie w dół do wszystkich zakresów potomnych.źródło
$rootScope
?Wykonałem następującą grafikę z następującego linku: https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/
Jak widać,
$rootScope.$broadcast
trafia o wiele więcej słuchaczy niż$scope.$emit
.Również
$scope.$emit
efekt bulgotania można anulować,$rootScope.$broadcast
ale nie można.źródło
$ scope. $ emit: Ta metoda wywołuje zdarzenie w górę (od dziecka do rodzica)
$ scope. $ broadcast: Metoda wywołuje zdarzenie w dół (od rodzica do dziecka) do wszystkich kontrolerów potomnych.
$ scope. $ on: Metoda rejestruje się w celu odsłuchania jakiegoś zdarzenia. Wszystkie kontrolery, które nasłuchują tego zdarzenia, otrzymują powiadomienie o emisji lub emitują na podstawie tego, gdzie mieszczą się one w hierarchii dziecko-rodzic.
Zdarzenie $ emit może zostać anulowane przez każdego z $ zakres, który nasłuchuje zdarzenia.
$ On zapewnia metodę „stopPropagation”. Wywołanie tej metody może uniemożliwić dalszą propagację zdarzenia.
Plunker: https://embed.plnkr.co/0Pdrrtj3GEnMp2UpILp4/
W przypadku zakresów rodzeństwa (zakresów, które nie znajdują się w bezpośredniej hierarchii rodzic-dziecko), wówczas $ emit i $ broadcast nie będą komunikować się z zasięgami rodzeństwa.
Więcej informacji można znaleźć na stronie http://yogeshtutorials.blogspot.in/2015/12/event-based-communication-between-angularjs-controllers.html
źródło
@Eddie udzielił idealnej odpowiedzi na zadane pytanie. Chciałbym jednak zwrócić uwagę na bardziej wydajne podejście Pub / Sub.
Jak sugeruje ta odpowiedź,
możesz użyć
angular-PubSub
modułu kątowego. po dodaniuPubSub
modułu do zależności aplikacji możesz użyćPubSub
usługi do subskrybowania i anulowania subskrypcji wydarzeń / tematów.Łatwa subskrypcja:
Łatwe do opublikowania
Aby anulować subskrypcję, użyj
PubSub.unsubscribe(sub);
LUBPubSub.unsubscribe('event-name');
.UWAGA Nie zapomnij anulować subskrypcji, aby uniknąć wycieków pamięci.
źródło
Użyj RxJS w usłudze
Zbuduj usługę z rozszerzeniami RxJS dla Angular .
Następnie subskrybuj zmiany.
Klienci mogą subskrybować zmiany za pomocą,
DataService.subscribe
a producenci mogą wprowadzać zmiany za pomocąDataService.set
.DEMO na PLNKR .
źródło