Ahora que la diferencia de rendimiento entre $broadcast
y $emit
ha sido eliminado, ¿hay alguna razón para preferir $scope.$emit
a $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.$broadcast
funciona 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.$emit
despacha el evento hacia arriba y $scope.$broadcast
- hacia abajo. Pero, ¿por qué no usar siempre $rootScope.$broadcast
para 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.$emit
solo deja que otros$rootScope
oyentes lo atrapen. Esto es bueno cuando no quieres que todos lo$scope
tengan. 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.$broadcast
es 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.$emit
es cuando quieres eso$scope
y todos sus padres y$rootScope
escuchar 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.$broadcast
es para el$scope
mismo y sus hijos. Este es un niño susurrando a sus animales de peluche para que sus padres no puedan escuchar.fuente
$rootScope
transmisiones donde sea posible permite una mejor reutilización.No están haciendo el mismo trabajo:
$emit
distribuye un evento hacia arriba a través de la jerarquía de alcance, mientras que$broadcast
distribuye 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.$broadcast
llega a muchos más oyentes que$scope.$emit
.Además,
$scope.$emit
el efecto de burbujeo se puede cancelar, mientras$rootScope.$broadcast
que no se puede.fuente
$ scope. $ emit: este método distribuye el evento en dirección ascendente (de secundario a primario)
$ scope. $ broadcast: Method distribuye el evento en dirección descendente (de padre a hijo) a todos los controladores secundarios.
$ scope. $ on: el método se registra para escuchar algún evento. Todos los controladores que están escuchando ese evento reciben una notificación de la emisión o emisión en función de dónde encajan en la jerarquía de elementos primarios y secundarios.
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-PubSub
el módulo angular. una vez que agregue elPubSub
módulo a la dependencia de su aplicación, puede usarPubSub
servicio 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.subscribe
y los productores pueden impulsar los cambios conDataService.set
.La DEMO en PLNKR .
fuente