Solución:
$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 utilizar $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.
.service("hiEventService",function($rootScope) {
this.broadcast = function() {$rootScope.$broadcast("hi")}
this.listen = function(callback) {$rootScope.$on("hi",callback)}
})
-
Que hace
$rootScope.$broadcast
¿hacer?$rootScope.$broadcast
está enviando un evento a través del ámbito de la aplicación. Cualquier alcance de niños de esa aplicación puede detectarlo 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)
!!! Una cosa para no hacer sin embargo 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 nuevamente, simplemente acumulará más oyentes de eventos. (Por lo tanto, una transmisión se captará varias veces). Usar$scope.$on()
en su lugar, los oyentes también serán destruidos. -
Cuál es la diferencia entre
$rootScope.$broadcast
Y$rootScope.$broadcast.apply
?A veces tienes 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í.
$ rootScope. $ broadcast es una forma conveniente de generar un evento “global” que todos los ámbitos secundarios pueden escuchar. Solo necesitas usar $rootScope
para difundir 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? Puedes 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. Esto es cuando $broadcast
es útil.