Quando você tem todos esses nós filhos aninhados tentando se comunicar assim, você verá rapidamente muitos $ on's , $ broadcast's e $ emit's .
Agora, em qualquer um dos nós filhos, você precisa apenas $ emitir a mensagem ou pegá-la usando $ on .
Observação: normalmente é muito fácil para cruzar conversa em um caminho aninhado sem usar $ emit , $ broadcast ou $ on , que significa que a maioria dos casos de uso são para quando você está tentando obter o nó 1 para se comunicar com o nó 2 ou vice-versa.
Você ainda precisará usar $ on com cada valor específico que deseja capturar, mas agora pode criar o que quiser em qualquer um dos nós sem ter que se preocupar em como passar a mensagem através da lacuna do nó pai conforme captamos e transmitimos os pushChangesToAllNodes genéricos.
Acabei adicionando uma biblioteca EventEmitter externa para projetar como um serviço e injetando-o onde quer que eu precise. Então eu posso "emitir" e "on" qualquer coisa em qualquer lugar sem se importar com herança de escopo. É menos problema dessa maneira e certamente melhor desempenho. Também mais legível para mim.
De acordo com os documentos do evento angularjs, o final receptor deve conter argumentos com uma estrutura como
- {Object} argumentos que são passados ​​pelo chamado (Observe que isso pode ser apenas um, então é melhor enviar um objeto de dicionário sempre)
Além disso, se você está tentando obter uma informação compartilhada disponível em diferentes controladores, há uma outra maneira de conseguir isso, ou seja, os serviços angulares. Como os serviços são singletons, as informações podem ser armazenadas e buscadas nos controladores. setter funciona naquele serviço, exponha essas funções, faça variáveis ​​globais no serviço e use-as para armazenar as informações
Eu sugeriria adicionalmente uma quarta opção como uma alternativa melhor às opções propostas por @zbynour.
Use $rootScope.$emit vez de $rootScope.$broadcast independente da relação entre o controlador de $rootScope.$broadcast e recepção. Dessa forma, o evento permanece dentro do conjunto de $rootScope.$$listeners enquanto que com $rootScope.$broadcast o evento se propaga para todos os escopos filhos, a maioria dos quais provavelmente não serão ouvintes daquele evento. E, claro, no final do controlador de recebimento, você só usa $rootScope.$on .