Estado globalmente interessante em angularjs

5

Eu criei talvez cinco serviços como RoleService , AuthService , etc. Cada um deles tem algum estado (por exemplo, RoleService.role , AuthService.isLoggedIn ) afetando muitos controladores e alguns outros serviços e diretivas.

Às vezes preciso $watch da variável, então minha solução hacky era colocar todo o serviço no $scope dos controladores que precisam dele. Eu até coloquei um dos serviços no $rootScope , o que me faz sentir mal, mas foi muito prático.

Qual é a prática recomendada para assistir ao estado do serviço?

Agora, tenho a ideia de criar um BaseService como um contêiner de dados para todas as variáveis interessantes (talvez cinco). Não haveria métodos, pois eles pertencem aos serviços onde estão agora. Isso não soa como OO, mas simplifica as coisas e remove as dependências entre os serviços:

Todos dependeriam do BaseService e seriam independentes. Não prejudicará os testes, pois BaseService é trivial para preencher os dados. Eu não vejo nenhuma desvantagem, mas não parece muito certo.

Esta é uma boa ideia? Quais alternativas melhores existem?

Ninguém respondeu, então tentei e funciona bem, apesar de BaseService agregar variáveis não relacionadas. Uma solução teoricamente mais limpa poderia ser criar um detentor de dados para cada serviço, algo como RoleService + RoleHolderService , AuthService + AuthStateHolderService , etc. Agora, os detentores dependeriam de nada e seu conteúdo deve ser tratado como lido somente por tudo além do serviço correspondente, isto é, RoleHolderService.role pode ser escrito somente pelo RoleHolderService .

Praticamente , agregar todos os titulares em um único serviço não é problema. A informação se uma parte do programa quer ler a função do usuário ou se ele está logado está perdido, mas não é uma grande perda, pois há tantos leitores assim. Controladores e serviços alterando esse estado fazem isso somente por meio de um método do serviço correspondente (por exemplo, AuthService.login ).

    
por maaartinus 29.08.2016 / 05:23
fonte

1 resposta

1

Esta é realmente uma boa pergunta. Eu vi esse tópico relacionado ao seu link mas ainda injetando $ rootScope na fábrica parece uma solução hacky porque $ radiodifusão evento em $ rootScope seria uma operação cara, acho que link podemos apenas despachar o evento personalizado na Angular Factory eu mesmo não experimentei, mas acho que isso poderia funcionar, então o evento pode ser distribuído na fábrica da Angular e desta forma a fábrica pode registrar e ouvir o evento em cada controlador.

Espero que isso também ajude você a resolver seu problema. Obrigado.

    
por 03.09.2016 / 23:21
fonte