Ahora que la diferencia de rendimiento entre $broadcasty $emitha sido eliminado, ¿hay alguna razón para preferir $scope.$emita $rootScope.$broadcast?
Son diferentes, si.
$emit está restringido a la jerarquía del alcance (hacia arriba): esto puede ser bueno si se ajusta a su diseño, pero me parece una restricción bastante arbitraria.
$rootScope.$broadcastfunciona en todos los que eligen escuchar el evento, lo cual es una restricción más sensata en mi mente.
¿Me estoy perdiendo de algo?
EDITAR:
Para aclarar en respuesta a una respuesta, la dirección del envío no es el problema que busco. $scope.$emitdespacha el evento hacia arriba y $scope.$broadcast- hacia abajo. Pero, ¿por qué no usar siempre $rootScope.$broadcastpara llegar a todos los oyentes previstos?
fuente

Respuestas:
tl; dr (este tl; dr es de la respuesta de @ sp00m a continuación)
Explicación detallada
$rootScope.$emitsolo deja que otros$rootScopeoyentes lo atrapen. Esto es bueno cuando no quieres que todos lo$scopetengan. Principalmente una comunicación de alto nivel. Piense en ello como adultos hablando entre ellos en una habitación para que los niños no puedan escucharlos.$rootScope.$broadcastes un método que permite que casi todo lo escuche. Esto sería el equivalente a que los padres griten que la cena está lista para que todos en la casa la escuchen.$scope.$emites cuando quieres eso$scopey todos sus padres y$rootScopeescuchar el evento. Este es un niño que se queja a sus padres en casa (pero no en una tienda de abarrotes donde otros niños pueden escuchar).$scope.$broadcastes para el$scopemismo y sus hijos. Este es un niño susurrando a sus animales de peluche para que sus padres no puedan escuchar.fuente
$rootScopetransmisiones donde sea posible permite una mejor reutilización.No están haciendo el mismo trabajo:
$emitdistribuye un evento hacia arriba a través de la jerarquía de alcance, mientras que$broadcastdistribuye un evento hacia abajo a todos los ámbitos secundarios.fuente
$rootScope?Hice el siguiente gráfico con el siguiente enlace: https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/
Como puede ver,
$rootScope.$broadcastllega a muchos más oyentes que$scope.$emit.Además,
$scope.$emitel efecto de burbujeo se puede cancelar, mientras$rootScope.$broadcastque no se puede.fuente
$ scope. $ emit: este método distribuye el evento en dirección ascendente (de secundario a primario)
El evento $ emit puede ser cancelado por cualquiera de los $ scope que está escuchando el evento.
$ On proporciona el método "stopPropagation". Al llamar a este método, se puede detener la propagación del evento.
Plunker: https://embed.plnkr.co/0Pdrrtj3GEnMp2UpILp4/
En el caso de ámbitos hermanos (los ámbitos que no están en la jerarquía directa padre-hijo), $ emit y $ broadcast no se comunicarán con los ámbitos hermanos.
Para obtener más detalles, consulte http://yogeshtutorials.blogspot.in/2015/12/event-based-communication-between-angularjs-controllers.html
fuente
@Eddie ha dado una respuesta perfecta a la pregunta formulada. Pero me gustaría llamar la atención sobre el uso de un enfoque más eficiente de Pub / Sub.
Como sugiere esta respuesta,
Puedes usar
angular-PubSubel módulo angular. una vez que agregue elPubSubmódulo a la dependencia de su aplicación, puede usarPubSubservicio para suscribirse y cancelar eventos / temas.Fácil de suscribir:
Fácil de publicar
Para cancelar la suscripción, use
PubSub.unsubscribe(sub);ORPubSub.unsubscribe('event-name');.NOTA No olvide darse de baja para evitar pérdidas de memoria.
fuente
Use RxJS en un servicio
Cree un servicio con RxJS Extensions para Angular .
Luego simplemente suscríbase a los cambios.
Los clientes pueden suscribirse a los cambios con
DataService.subscribey los productores pueden impulsar los cambios conDataService.set.La DEMO en PLNKR .
fuente