Tentei encontrar algumas informações básicas para AngularJS $rootScope.$broadcast
, mas a documentação do AngularJS não ajuda muito. Em palavras fáceis, por que usamos isso?
Além disso, dentro do modelo Hot Towel de John Papa, há uma função personalizada no módulo comum chamada $broadcast
:
function $broadcast() {
return $rootScope.$broadcast.apply($rootScope, arguments);
}
Eu não entendi o que isso está fazendo. Então, aqui estão algumas perguntas básicas:
1) O que $rootScope.$broadcast
fazer?
2) Qual é a diferença entre $rootScope.$broadcast
e $rootScope.$broadcast.apply
?
$rootScope.$broadcast.apply()
é usado porque se você deseja passar oarguments
objeto especial para outra função, você precisa usarapply()
(ao invés decall()
). Além do link de @ Blackhole para a página MDN em aplicar, você também pode verificar a entrada emarguments
.Respostas:
O que
$rootScope.$broadcast
fazer?$rootScope.$broadcast
está enviando um evento por meio do escopo do aplicativo. Qualquer criança alcance desse aplicativo pode pegá-lo usando um simples:$scope.$on()
.É especialmente útil enviar eventos quando você deseja alcançar um escopo que não seja um pai direto (um ramo de um pai, por exemplo)
!!! Uma coisa a não fazer, no entanto, é usar a
$rootScope.$on
partir de um controlador.$rootScope
é a aplicação, quando seu controlador for destruído, aquele ouvinte de evento ainda existirá, e quando seu controlador for criado novamente, ele apenas acumulará mais ouvintes de evento. (Assim, uma transmissão será capturada várias vezes). Em$scope.$on()
vez disso, use e os ouvintes também serão destruídos.Qual é a diferença entre
$rootScope.$broadcast
&$rootScope.$broadcast.apply
?Às vezes você precisa usar
apply()
, especialmente ao trabalhar com diretivas e outras bibliotecas JS. No entanto, como não conheço essa base de código, não seria capaz de dizer se é esse o caso aqui.fonte
$rootScope.$on
vazamento de memória. Isso também se aplica à resposta aceita, pois os controladores provavelmente chamarão ohiEventService
criado.$broadcast
vs.$broadcast.apply()
$rootScope
basicamente funciona como um ouvinte e despachante de eventos.Para responder à questão de como ele é usado, é usado em conjunto com
rootScope.$on
;No entanto, é uma prática ruim usar
$rootScope
como serviço de evento geral do seu próprio aplicativo, já que você rapidamente terminará em uma situação em que cada aplicativo depende de $ rootScope e você não sabe quais componentes estão ouvindo quais eventos.A prática recomendada é criar um serviço para cada evento personalizado que você deseja ouvir ou transmitir.
fonte
hiEventService.listen(callback)
de um controlador, o ouvinte ainda existirá mesmo depois que o controlador for destruído. Vazamento de memória! A vinculação ao escopo do controlador$scope.$on("hi",callback)
vem com limpeza automática.$ rootScope. $ broadcast é uma maneira conveniente de gerar um evento "global" que todos os escopos filhos podem ouvir. Você só precisa usar
$rootScope
para transmitir a mensagem, já que todos os escopos descendentes podem ouvi-la.O escopo raiz transmite o evento:
Qualquer filho Scope pode ouvir o evento:
Por que usamos $ rootScope. $ Broadcast? Você pode usar
$watch
para ouvir as mudanças de variáveis e executar funções quando o estado da variável muda. No entanto, em alguns casos, você simplesmente deseja gerar um evento que outras partes do aplicativo possam ouvir, independentemente de qualquer alteração no estado da variável de escopo. É quando$broadcast
é útil.fonte
Passando dados !!!
Eu me pergunto por que ninguém menciona que
$broadcast
aceita um parâmetro onde você pode passar umObject
que será recebido$on
usando uma função de callbackExemplo:
fonte
O que $ rootScope. $ Broadcast faz?
Ele transmite a mensagem para os respectivos ouvintes em todo o aplicativo angular, um meio muito poderoso de transferir mensagens para escopos em diferentes níveis hierárquicos (seja pai, filho ou irmãos)
Da mesma forma, temos $ rootScope. $ Emit, a única diferença é que o primeiro também é capturado por $ scope. $ On, enquanto o último é capturado apenas por $ rootScope. $ On.
consulte para exemplos: - http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/
fonte