Теперь, когда разница в производительности между $broadcast
и $emit
была устранена, нет никаких оснований предпочесть , $scope.$emit
чтобы $rootScope.$broadcast
?
Они разные, да.
$emit
ограничено иерархией области действия (вверх) - это может быть хорошо, если оно соответствует вашему дизайну, но мне кажется, это довольно произвольное ограничение.
$rootScope.$broadcast
работает во всех, кто хочет слушать событие, что является более разумным ограничением в моем уме.
Я что-то пропустил?
РЕДАКТИРОВАТЬ:
Чтобы уточнить в ответ на ответ, направление отправки не вопрос, который я после. $scope.$emit
отправляет событие вверх, а $scope.$broadcast
вниз. Но почему не всегда использовать $rootScope.$broadcast
для достижения всех предполагаемых слушателей?
angularjs
angularjs-scope
Новый Дев
источник
источник
Ответы:
tl; dr (это tl; dr из ответа @ sp00m ниже)
Детальное объяснение
$rootScope.$emit
только позволяет другим$rootScope
слушателям ловить это. Это хорошо, когда ты не хочешь, чтобы каждый$scope
получил это. В основном общение высокого уровня. Думайте об этом как о взрослых, разговаривающих друг с другом в комнате, чтобы дети не могли их слышать.$rootScope.$broadcast
это метод, который позволяет почти всем слышать это. Это было бы равносильно тому, что родители кричат, что ужин готов, поэтому все в доме его слышат.$scope.$emit
это когда хочется этого$scope
и всем своим родителям и$rootScope
услышать событие. Это ребенок, который ныет родителям дома (но не в продуктовом магазине, где другие дети могут слышать).$scope.$broadcast
для$scope
себя и своих детей. Это ребенок шепчет своим чучелам, чтобы их родители не могли слышать.источник
$rootScope
трансляций, где это возможно, позволяет лучше использовать повторноОни не выполняют одну и ту же работу:
$emit
отправляют событие вверх по иерархии области, а$broadcast
событие отправляют вниз всем дочерним областям.источник
$rootScope
?Я сделал следующий рисунок из следующей ссылки: https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribeing/
Как видите,
$rootScope.$broadcast
слушателей гораздо больше, чем слушателей$scope.$emit
.Также,
$scope.$emit
пузырьковый эффект можно отменить, а$rootScope.$broadcast
нельзя.источник
$ scope. $ emit: этот метод отправляет событие в направлении вверх (от дочернего к родительскому)
$ scope. $ broadcast: метод отправляет событие в направлении вниз (от родителя к потомку) всем дочерним контроллерам.
$ scope. $ on: метод регистрирует прослушивание какого-либо события. Все контроллеры, которые прослушивают это событие, получают уведомление о широковещании или излучении в зависимости от того, где они находятся в иерархии дочерних элементов.
Событие $ emit может быть отменено любым из $ scope, который прослушивает событие.
$ On предоставляет метод stopPropagation. При вызове этого метода событие может быть остановлено для дальнейшего распространения.
Плункер: https://embed.plnkr.co/0Pdrrtj3GEnMp2UpILp4/
В случае одноуровневых областей (областей, которые не находятся в прямой иерархии родитель-потомок), $ emit и $ broadcast не будут связываться с одноуровневыми областями.
Для получения более подробной информации, пожалуйста, обратитесь к http://yogeshtutorials.blogspot.in/2015/12/event-based-communication-between-angularjs-controllers.html
источник
@ Эдди дал прекрасный ответ на заданный вопрос. Но я хотел бы обратить внимание на использование более эффективного подхода Pub / Sub.
Как следует из этого ответа,
Вы можете использовать
angular-PubSub
угловой модуль. добавивPubSub
модуль в свою зависимость от приложения, вы можете использоватьPubSub
сервис для подписки и отмены подписки на события / темы.Легко подписаться:
Легко публиковать
Чтобы отписаться, используйте
PubSub.unsubscribe(sub);
ORPubSub.unsubscribe('event-name');
.ПРИМЕЧАНИЕ Не забудьте отписаться, чтобы избежать утечек памяти.
источник
Используйте RxJS в Сервисе
Создайте сервис с расширениями RxJS для Angular .
Тогда просто подпишитесь на изменения.
Клиенты могут подписываться на изменения,
DataService.subscribe
а производители могут продвигать измененияDataService.set
.DEMO на PLNKR .
источник