¿Por qué usamos $ rootScope. $ Broadcast en AngularJS?

109

Intenté encontrar información básica para AngularJS $rootScope.$broadcast, pero la documentación de AngularJS no ayuda mucho. En palabras sencillas, ¿por qué usamos esto?

Además, dentro de la plantilla Hot Towel de John Papa hay una función personalizada en el módulo común llamado $broadcast:

function $broadcast() {
    return $rootScope.$broadcast.apply($rootScope, arguments);
}

No entendí qué está haciendo esto. Así que aquí hay un par de preguntas básicas:

1) ¿Qué hace $rootScope.$broadcast?

2) ¿Cuál es la diferencia entre $rootScope.$broadcasty $rootScope.$broadcast.apply?

Nexus23
fuente
$rootScope.$broadcast.apply()se usa porque si desea pasar el argumentsobjeto especial a otra función, debe usar apply()(en lugar de call()). Además del enlace de @ Blackhole a la página de MDN en la solicitud, también puede consultar la entrada en arguments.
Scott Schupbach

Respuestas:

97
  1. ¿Qué $rootScope.$broadcasthacer?

    $rootScope.$broadcastestá enviando un evento a través del ámbito de la aplicación. Cualquier niños alcance de la aplicación puede atraparlo usando un simple: $scope.$on().

    Es especialmente útil enviar eventos cuando desea alcanzar un alcance que no es un padre directo (una rama de un padre, por ejemplo)

    !!! Sin embargo, una cosa que no debe hacer es usar $rootScope.$ondesde un controlador. $rootScopees la aplicación, cuando su controlador sea destruido, ese oyente de eventos seguirá existiendo, y cuando su controlador se cree de nuevo, simplemente acumulará más oyentes de eventos. (Entonces, una transmisión será captada varias veces). Úselo en su $scope.$on()lugar, y los oyentes también serán destruidos.

  2. ¿Cuál es la diferencia entre $rootScope.$broadcast& $rootScope.$broadcast.apply?

    A veces tiene que usar apply(), especialmente cuando se trabaja con directivas y otras bibliotecas JS. Sin embargo, dado que no conozco esa base de código, no podría decir si ese es el caso aquí.

usuario1412031
fuente
11
Gran captura en la $rootScope.$onpérdida de memoria. Esto también se aplica a la respuesta aceptada, ya que es probable que los controladores llamen al hiEventServiceque creó.
Adamdport
¿Cuál es un ejemplo en el que usaría $broadcastvs.$broadcast.apply()
invitado
$ rootScope. $ broadcast envía el evento a todos los oyentes, no solo a los oyentes de los ámbitos secundarios. $ scope. $ broadcast limita el evento a ámbitos secundarios
Geert Bellemans
157

$rootScope básicamente funciona como un detector y despachador de eventos.

Para responder a la pregunta de cómo se usa, se usa junto con rootScope.$on;

$rootScope.$broadcast("hi");

$rootScope.$on("hi", function(){
    //do something
});

Sin embargo, es una mala práctica utilizarlo $rootScopecomo servicio general de eventos de su propia aplicación, ya que rápidamente terminará en una situación en la que cada aplicación depende de $ rootScope y no sabe qué componentes están escuchando qué eventos.

La mejor práctica es crear un servicio para cada evento personalizado que desee escuchar o transmitir.

.service("hiEventService",function($rootScope) {
    this.broadcast = function() {$rootScope.$broadcast("hi")}
    this.listen = function(callback) {$rootScope.$on("hi",callback)}
})
Susurrador de códigos
fuente
4
Gracias @itcouldevenbeabout, ¿esta línea no llama a la misma lógica de adjuntar un evento a global $ rootScope? function () {$ rootScope. $ broadcast ("hola")}, ¿que mencionaste es una mala práctica?
Nexus 23 de
11
Usar un servicio para hacer las transmisiones y también adjuntar a los oyentes para un evento específico evita la situación en la que no está seguro de quién está escuchando. Queda claro qué componentes tienen el servicio de eventos como dependencia
CoolTapes
4
Habiendo descubierto la diferencia entre $ emit y $ broadcast, me inclinaría a decir que sería mejor $ emitir el evento; de esa manera, el evento contamina en el conjunto de alcances más pequeño posible (idealmente, el servicio tendría es su propio alcance, pero no creo que sea posible?)
Brondahl
3
-1. No veo cómo el aislamiento en un servicio es mejor que simplemente transmitir. De todos modos, mejor utilice su propio ámbito privado en el servicio. Y mejor use $ emit, y no $ broadcast. Además, su servicio propuesto no admite argumentos de eventos. Lo que es peor, no admite la cancelación de la suscripción; un pecado mortal para $ rootScope.
alpha-mouse
3
La falta de cancelación de la suscripción me arruina esta respuesta. Si llama hiEventService.listen(callback)desde un controlador, el oyente seguirá existiendo incluso después de que se destruya el controlador. ¡Pérdida de memoria! La vinculación al alcance del controlador $scope.$on("hi",callback)viene con limpieza automática.
Adamdport
32

$ rootScope. $ broadcast es una forma conveniente de generar un evento "global" que todos los ámbitos secundarios pueden escuchar. Solo necesita usar $rootScopepara transmitir el mensaje, ya que todos los ámbitos descendientes pueden escucharlo.

El alcance raíz transmite el evento:

$rootScope.$broadcast("myEvent");

Cualquier niño Scope puede escuchar el evento:

$scope.$on("myEvent",function () {console.log('my event occurred');} );

¿Por qué usamos $ rootScope. $ Broadcast? Puede usar $watchpara escuchar cambios de variable y ejecutar funciones cuando cambia el estado de la variable. Sin embargo, en algunos casos, simplemente desea generar un evento que otras partes de la aplicación puedan escuchar, independientemente de cualquier cambio en el estado de la variable de alcance. Aquí es cuando $broadcastes útil.

James Lawruk
fuente
19

Pasando datos !!!

Me pregunto por qué nadie menciona que $broadcastacepta un parámetro en el que puede pasar un Objectque se recibirá mediante el $onuso de una función de devolución de llamada

Ejemplo:

// the object to transfert
var myObject = {
    status : 10
}

$rootScope.$broadcast('status_updated', myObject);
$scope.$on('status_updated', function(event, obj){
    console.log(obj.status); // 10
})
Esmerejón
fuente
8

¿Qué hace $ rootScope. $ Broadcast?

Transmite el mensaje a los respectivos oyentes en toda la aplicación angular, un medio muy poderoso para transferir mensajes a ámbitos en diferentes niveles jerárquicos (ya sea padre, hijo o hermanos)

De manera similar, tenemos $ rootScope. $ Emit, la única diferencia es que el primero también es capturado por $ scope. $ On mientras que el segundo es capturado solo por $ rootScope. $ On.

consulte para ver ejemplos: - http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/

Prashant K
fuente