Agora que a diferença de desempenho entre $broadcast
e $emit
foi eliminada, há alguma razão para preferir $scope.$emit
a $rootScope.$broadcast
?
Eles são diferentes, sim.
$emit
está restrito à hierarquia de escopo (para cima) - isso pode ser bom, se for adequado ao seu design, mas me parece uma restrição bastante arbitrária.
$rootScope.$broadcast
funciona em todos os que escolhem ouvir o evento, o que é uma restrição mais sensata em minha mente.
Estou esquecendo de algo?
EDITAR:
Para esclarecer em resposta a uma resposta, a direção da expedição não é o problema que estou procurando. $scope.$emit
despacha o evento para cima e $scope.$broadcast
para baixo. Mas por que não usar sempre $rootScope.$broadcast
para alcançar todos os ouvintes pretendidos?
angularjs
angularjs-scope
New Dev
fonte
fonte
Respostas:
tl; dr (este tl; dr é da resposta de @ sp00m abaixo)
Explicação detalhada
$rootScope.$emit
apenas permite que outros$rootScope
ouvintes o capturem. Isso é bom quando você não quer que todos$scope
obtenham. Principalmente uma comunicação de alto nível. Pense nisso como adultos conversando em uma sala para que as crianças não possam ouvi-los.$rootScope.$broadcast
é um método que permite que praticamente tudo o ouça. Isso seria o equivalente a pais gritando que o jantar está pronto para que todos na casa o ouçam.$scope.$emit
é quando você quer isso$scope
e todos os seus pais e$rootScope
ouvir o evento. É uma criança choramingando para os pais em casa (mas não em um supermercado onde outras crianças possam ouvir).$scope.$broadcast
é para$scope
si e seus filhos. É uma criança sussurrando para seus bichos de pelúcia para que seus pais não possam ouvir.fonte
$rootScope
transmissões sempre que possível permite uma melhor reutilização.Eles não estão fazendo o mesmo trabalho:
$emit
despacha um evento para cima através da hierarquia de escopo, enquanto$broadcast
despacha um evento para baixo para todos os escopos filhos.fonte
$rootScope
?Criei o seguinte gráfico a partir do seguinte link: https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/
Como você pode ver,
$rootScope.$broadcast
atinge muito mais ouvintes do que$scope.$emit
.Além disso,
$scope.$emit
o efeito de bolha do pode ser cancelado, enquanto$rootScope.$broadcast
não pode.fonte
$ scope. $ emit: este método despacha o evento na direção ascendente (do filho para o pai)
$ scope. $ broadcast: o método despacha o evento na direção descendente (de pai para filho) para todos os controladores filhos.
$ scope. $ on: o método é registrado para ouvir algum evento. Todos os controladores que estão ouvindo esse evento recebem uma notificação da transmissão ou emitem com base no local em que eles se encaixam na hierarquia pai-filho.
O evento $ emit pode ser cancelado por qualquer um dos escopos $ que estiver ouvindo o evento.
O $ on fornece o método "stopPropagation". Ao chamar esse método, o evento pode ser impedido de se propagar mais.
Plunker: https://embed.plnkr.co/0Pdrrtj3GEnMp2UpILp4/
No caso de escopos irmãos (os escopos que não estão na hierarquia pai-filho direta), $ emitem e $ broadcast não se comunicam com os escopos irmãos.
Para obter mais detalhes, consulte http://yogeshtutorials.blogspot.in/2015/12/event-based-communication-between-angularjs-controllers.html
fonte
@ Eddie deu uma resposta perfeita da pergunta. Mas eu gostaria de chamar a atenção para o uso de uma abordagem mais eficiente do Pub / Sub.
Como essa resposta sugere,
você pode usar
angular-PubSub
o módulo angular. depois de adicionar oPubSub
módulo à dependência do aplicativo, você pode usar oPubSub
serviço para assinar e cancelar a inscrição de eventos / tópicos.Fácil de se inscrever:
Fácil de publicar
Para cancelar a inscrição, use
PubSub.unsubscribe(sub);
ORPubSub.unsubscribe('event-name');
.NOTA Não se esqueça de cancelar a inscrição para evitar vazamentos de memória.
fonte
Use RxJS em um serviço
Crie um serviço com RxJS Extensions for Angular .
Em seguida, basta assinar as alterações.
Os clientes podem assinar alterações
DataService.subscribe
e os produtores podem enviar alterações comDataService.set
.A DEMO em PLNKR .
fonte