Angolare 7 - Iniezione di uno stato / istantanea di contesto

0

Requisiti

C'è uno stato di applicazione "globale" (per ragioni di discussione) che mi interessa iniettare nei componenti.

Ogni componente candidato dovrebbe ricevere un'istantanea immutabile dello stato esistente al momento in cui è stato richiamato il suo costruttore (per chiarezza assoluta, lo snapshot di stato che viene iniettato nel costruttore di ciascun componente non deve cambiare quando lo stato globale cambia).

Vincoli

Non posso (e non desidero) utilizzare un servizio di livello root o una costante globale da cui i componenti richiedono un'istantanea di stato. Una soluzione del genere richiederebbe che un componente richieda esplicitamente uno snapshot di stato (dal servizio inserito o dalla costante globale) dal suo costruttore, perché se tentasse di recuperarlo successivamente nel suo ciclo di vita, lo stato potrebbe essere cambiato e non essere più rilevante ad esso.

Voglio evitare di dover dichiarare un servizio iniettato localmente all'interno dell'array dei provider di ciascun componente client. Questo è inutilmente gravoso. I client devono essere in grado di iniettare semplicemente un tipo (o token di iniezione) e ricevere uno snapshot di stato.

Problema

Sebbene un metodo di produzione di iniezione sembrasse in superficie una soluzione ovvia (copiava lo stato globale e lo restituiva all'iniettore, che a sua volta lo passava al costruttore del componente), la fabbrica viene invocata una sola volta ( per ogni livello nella gerarchia di iniezione per la quale è stato configurato un provider). Capisco che questo è di progettazione, tuttavia penso che ci sia un buon caso d'uso per la funzionalità che ho descritto.

Ciò che potrebbe funzionare è un'implementazione di una fabbrica di iniezione simile nel concetto a tubi angolari puri e impuri, in cui una fabbrica (o potenzialmente qualsiasi configurazione di iniezione) potrebbe essere dichiarata "impura", il che comporterebbe l'iniezione di una nuova istanza in ogni componente dipendente.

Sicuramente c'è un modo per farlo?

    
posta Bryce Marshall 21.11.2018 - 01:04
fonte

1 risposta

0

Creerei un servizio che contiene lo stato e che aggiorna lo stato quando necessario.

Inietta quel servizio nei componenti.

Il servizio contiene un metodo che restituisce una copia dello stato corrente, tale metodo può essere richiamato nei costruttori di componenti e nei metodi NgOnInit.

Se in seguito ti rendi conto che hai bisogno di alcuni componenti per poter reagire agli stati aggiornati, puoi rendere il servizio osservabile e ascoltare solo quei componenti che richiedono aggiornamenti.

I servizi in Angular 2+ sono condivisi tra tutti i componenti che li hanno iniettati.

    
risposta data 21.11.2018 - 15:49
fonte

Leggi altre domande sui tag