Stato globalmente interessante in angularjs

5

Ho creato forse cinque servizi come RoleService , AuthService , ecc. Ognuno di essi ha uno stato (es. RoleService.role , AuthService.isLoggedIn ) che influenza molti controller e alcuni altri servizi e direttive.

A volte ho bisogno di $watch della variabile, quindi la mia soluzione hacky era di mettere l'intero servizio nella $scope dei controller che ne hanno bisogno. Ho persino inserito uno dei servizi su $rootScope , il che mi fa sentire male, ma è stato molto pratico.

Qual è la migliore prassi per guardare lo stato del servizio?

Ora ho l'idea di creare un BaseService come contenitore di dati per tutte le (forse cinque) variabili interessanti. Non ci sarebbero metodi, in quanto appartengono ai servizi in cui sono ora. Questo non suona come OO, ma semplifica le cose e rimuove le dipendenze tra i servizi:

Tutti dipendono dal BaseService e sarebbero altrimenti indipendenti. Non danneggerà i test poiché BaseService è banale da riempire con i dati. Non riesco a vedere nessun aspetto negativo, ma non mi sembra giusto.

Questa è una buona idea? Quali alternative migliori esistono?

Nessuno ha risposto, quindi ho provato e funziona bene, nonostante BaseService aggregando variabili non correlate. Una soluzione pulente teoricamente potrebbe essere quella di creare un titolare di dati per ogni servizio, qualcosa come RoleService + RoleHolderService , AuthService + AuthStateHolderService , ecc. Ora, i titolari non dipenderebbero da nulla e il loro contenuto deve essere trattato come letto -solo da tutto oltre al loro servizio di corresponsione, cioè RoleHolderService.role può essere scritto solo da RoleHolderService .

In pratica , l'aggregazione di tutti i titolari in un singolo servizio non è un problema. L'informazione se una parte del programma vuole leggere il ruolo dell'utente o se è loggato va persa, ma non è una grande perdita in quanto ci sono così tanti lettori di questo tipo. Controllori e servizi modificando tale stato lo fanno solo tramite un metodo del servizio corrispondente (ad esempio AuthService.login ).

    
posta maaartinus 29.08.2016 - 05:23
fonte

1 risposta

1

Questa è davvero una buona domanda, ho trovato questo thread correlato al tuo problema link ma che sto ancora iniettando $ rootScope in fabbrica sembra una piccola soluzione hacky perché $ broadcasting event su $ rootScope sarebbe un'operazione costosa, credo che link possiamo solo inviare l'evento personalizzato su Angular Factory non li ho provati da solo, ma penso che potrebbe funzionare, quindi l'evento può essere inviato alla fabbrica Angular e in questo modo la fabbrica può registrarsi e ascoltare l'evento in ogni controller.

Spero che questo ti aiuterà anche a risolvere il tuo problema. Grazie.

    
risposta data 03.09.2016 - 23:21
fonte

Leggi altre domande sui tag