Por que usamos $ rootScope. $ Broadcast in AngularJS?

Tentei encontrar algumas informações básicas para o 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 template Hot Towel de John Papa existe uma function customizada no módulo comum chamado $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 o $rootScope.$broadcast faz?

2) Qual é a diferença entre $rootScope.$broadcast e $rootScope.$broadcast.apply ?

    1. O que o $rootScope.$broadcast faz?

      $rootScope.$broadcast está enviando um evento através do escopo do aplicativo. Qualquer escopo de crianças desse aplicativo pode capturá-lo usando um simples: $scope.$on() .

      É especialmente útil enviar events quando você deseja alcançar um escopo que não é um pai direto (um ramo de um pai, por exemplo)

      !!! Uma coisa a não fazer, no entanto, é usar $rootScope.$on de um controlador. $rootScope é o aplicativo, quando seu controlador é destruído, o 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). Use $scope.$on() , e os listeners também serão destruídos.

    2. Qual é a diferença entre $rootScope.$broadcast & $rootScope.$broadcast.apply ?

      Às vezes você tem que 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.

    $rootScope basicamente funciona como um ouvinte de events e um dispatcher.

    Para responder a questão de como é usado, ele é usado em conjunto com o rootScope.$on

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

    No entanto, é uma prática ruim usar o $rootScope como o serviço de evento geral de seu aplicativo, já que você acabará rapidamente em uma situação em que cada aplicativo depende de $ rootScope e você não sabe quais componentes estão ouvindo quais events.

    A prática recomendada é criar um serviço para cada evento personalizado que você deseja ouvir ou transmitir.

     .service("hiEventService",function($rootScope) { this.broadcast = function() {$rootScope.$broadcast("hi")} this.listen = function(callback) {$rootScope.$on("hi",callback)} }) 

    $ rootScope. $ broadcast é uma maneira conveniente de criar um evento “global” que todos os escopos filho possam 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:

     $rootScope.$broadcast("myEvent"); 

    Qualquer criança Escopo pode ouvir o evento:

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

    Por que usamos $ rootScope. $ Broadcast? Você pode usar $watch para escutar mudanças de variables ​​e executar funções quando o estado da variável é alterado. No entanto, em alguns casos, você simplesmente deseja criar um evento que outras partes do aplicativo possam atender, independentemente de qualquer alteração no estado da variável de escopo. Isso é quando $broadcast é útil.

    Passando dados !!!

    Eu me pergunto por que ninguém menciona que $broadcast aceitar um parâmetro onde você pode passar um Object que será recebido por $on usando uma function de retorno de chamada

    Exemplo:

     // the object to transfert var myObject = { status : 10 } $rootScope.$broadcast('status_updated', myObject); $rootScope.$on('status_updated', function(event, obj){ console.log(obj.status); // 10 }) 

    O que o $ rootScope. $ Broadcast faz?

    Ele transmite a mensagem para os respectivos ouvintes em todo o aplicativo angular, um meio muito poderoso para 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 pelo $ scope. $ On, enquanto o último é capturado apenas pelo $ rootScope. $ On.

    consulte os exemplos: – http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/