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.$broadcast
y $rootScope.$broadcast.apply
?
$rootScope.$broadcast.apply()
se usa porque si desea pasar elarguments
objeto especial a otra función, debe usarapply()
(en lugar decall()
). Además del enlace de @ Blackhole a la página de MDN en la solicitud, también puede consultar la entrada enarguments
.Respuestas:
¿Qué
$rootScope.$broadcast
hacer?$rootScope.$broadcast
está 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.$on
desde un controlador.$rootScope
es 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.¿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í.fuente
$rootScope.$on
pérdida de memoria. Esto también se aplica a la respuesta aceptada, ya que es probable que los controladores llamen alhiEventService
que creó.$broadcast
vs.$broadcast.apply()
$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
;Sin embargo, es una mala práctica utilizarlo
$rootScope
como 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.
fuente
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.$ rootScope. $ broadcast es una forma conveniente de generar un evento "global" que todos los ámbitos secundarios pueden escuchar. Solo necesita usar
$rootScope
para transmitir el mensaje, ya que todos los ámbitos descendientes pueden escucharlo.El alcance raíz transmite el evento:
Cualquier niño Scope puede escuchar el evento:
¿Por qué usamos $ rootScope. $ Broadcast? Puede usar
$watch
para 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$broadcast
es útil.fuente
Pasando datos !!!
Me pregunto por qué nadie menciona que
$broadcast
acepta un parámetro en el que puede pasar unObject
que se recibirá mediante el$on
uso de una función de devolución de llamadaEjemplo:
fuente
¿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/
fuente