Prós / Contras de usar eventos intensamente para manter os controladores sincronizados em aplicativos angulares complexos

Alguém pode me dar alguns conselhos sobre os prós / contras do uso intenso de eventos para manter diferentes partes de um aplicativo Angular sincronizadas entre si?

Estou pensando em usar uma série de eventos e ouvintes de eventos para conectar um SPA com várias visualizações simultâneas e aninhadas, fornecidas pela Angular'sroteador ui. O layout do SPA pode ser análogo ao gmail, onde existem regiões logicamente separadas da tela (área esquerda com lista de pastas de correio, barra de navegação superior, exibição de detalhes principais etc.).

Eu tenho procurado maneiras de manter todos os controladores sincronizados com relação aos modelos que todos eles precisam acessar ao mesmo tempo. Quando um modelo é atualizado pela visualização superior, se algum modelo é exibido na visualização principal, desejo que a visualização principal observe a alteração e atualize sua visualização adequadamente.

Uso serviços para compartilhar modelos entre controladores, como é considerada a melhor prática, mas há problemas com essa abordagem, conforme discutido em profundidadenesta pergunta.

Uma solução possível para isso é usar o Angular$broadcast e.$on('event, fn()) para que os controladores notem quando um serviço de que eles se preocupam tem dados atualizados.

Problemas:

Usando eventos para transmitir dados em vez de usar serviços (acoplamento rígido, ignorando qualquer fonte de dados autorizada). Eu conheço vocêpode passar objeto com eventos, mas você não precisa.

Desempenho (eventos borbulham na hierarquia de $ scope, etc).

$broadcast/$emit tenho preocupações de desempenho e acoplamento rígido que são abordadas em abundância aqui e em outros lugares, e estou pensando em usar a solução de uma resposta SOaqui para resolver vazamentos de desempenho / memória por não limpar os ouvintes quando os controladores são destruídos.

Manutenção (código de espaguete / ignorando o OO e apenas passando o modelo do aplicativo inteiro em eventos). Esta é a principal questão que tenho para a comunidade: com base no diagrama (feio) abaixo, imagino cada angular.service acionando um evento quando obtém dados atualizados do modelo, e qualquer controlador que se preocupa com esses dados apenas escuta o acionamento do evento:

Na verdade, é simples de codificar (funciona agora), mas eu me preocupo com a dor de cabeça de cinco anos a partir de agora ao tentar acompanhar todos os relacionamentos de eventos.

Alguém tem alguma experiência com um design como este, que pode me dar alguns conselhos sobre um design mais inteligente / conciso?

Agradecemos antecipadamente e desculpe-me pelo diagrama bruto ... espero que chegue ao ponto.

questionAnswers(3)

yourAnswerToTheQuestion