2014-10-23 15 views
11

Ho diversi servizi che utilizzano un servizio Web e memorizzano nella cache molti dei risultati. Caching intendo l'archiviazione in una variabile sul servizio. Quando un utente si disconnette, i dati devono essere cancellati. I servizi si presenta come il seguente (versione semplificata):Buone pratiche per la cancellazione dei dati nei servizi al logout in AngularJs

class DataService { 

    private data; 

    constructor($http) 
    { 
    $http.get(url).then((response) => 
     { 
      this.data = response.data; 
     }); 
    } 

}

Che è dattiloscritto, ma decide di qualcosa di simile:

var DataService = (function() { 
    function DataService($http) { 
     var _this = this; 
     $http.get(url).then(function (response) { 
      _this.data = response.data; 
     }); 
    } 
    return DataService; 
})(); 

ho potuto cancellare i dati utilizzando la risposta in This Question Che sta facendo qualcosa del genere:

$rootScope.on('logout',function(){ 
    this.data = []; 
}); 

Tuttavia, questo è un sacco di codice quando abbiamo più servizi e controller. E sappiamo tutti che questo nuovo tipo aggiungerà alcuni nuovi dati a un servizio e dimenticherà di aggiungerlo alla sequenza di disconnessione. È semplicemente una cattiva pratica.

Analogamente, i dati vengono memorizzati su $ scope in varie parti dell'applicazione e anche questo deve essere cancellato. L'ambito è piuttosto semplice in quanto i costruttori per i controllori vengono caricati in ogni pagina e quindi sostituiscono i dati.

Una soluzione di prova è di effettuare un aggiornamento, tuttavia questo dà esperienze utente orribile.

Una soluzione potrebbe essere quella di far credere angolare che i servizi non siano mai stati creati o ricaricati completamente angolari.

Qual è il modo migliore per farlo? È male memorizzare i dati nelle variabili sui servizi?

+1

Domanda interessante. Sicuramente non * tutti * i tuoi servizi si affidano all'utente connesso? TypeScript potrebbe tornare utile qui. È possibile definire un'interfaccia, ad esempio 'ILoggedInUserService' che espone un metodo' tearDown() '. Ciò costringerebbe lo sviluppatore ad implementare questo metodo per tutti i servizi applicabili. Potresti quindi [enumerare] (http://stackoverflow.com/questions/19411502/angular-get-list-of-all-registered-services) ed eseguire la disconnessione – CodingIntrigue

+5

Mi occupo di ciò trasmettendo un evento e tutto i servizi pertinenti ripuliscono i loro dati ascoltando quell'evento.Questo mantiene il codice pulito senza interdipendenze. – harishr

risposta

9

È possibile creare un servizio responsabile della cancellazione di tutti i dati dagli altri servizi. In questo caso è sufficiente chiamare il metodo "clear" di questo servizio e implementare le singole chiamate chiare all'interno di questa (quindi implementate una sola volta).

Ciò offre anche il vantaggio di disporre di una panoramica dei dati dei servizi che devono essere cancellati continuamente, poiché in futuro si potrebbero avere delle eccezioni.

vedere anche questa risposta per il vostro riferimento: Injecting a service into another service in angularJS

+0

È ancora necessario specificare i singoli dati, a meno che non archiviamo tutti i dati dei servizi in un oggetto separato per ciascun servizio. Quindi eliminare questo oggetto lo cancellerebbe. – CodeTower

+0

@Kabahango, hai trovato un modo per aggirare questo senza dover specificare tutte le proprietà che vuoi ripristinare? Sento che l'opzione di ricarica della finestra è probabilmente un'opzione migliore di questa. – m0g

+0

Non esattamente. Ma un buon approccio è quello di rendere "pattern Repository" tale che tutti i dati nella tua app siano archiviati in uno o più repository. Questo non è un trucco di per sé, ma è un buon modello di design. – CodeTower

4

è possibile utilizzare un aggiornamento della pagina intera:

$window.location.reload(); 

questo sarà riavviare l'intero stato della vostra applicazione

un'altra soluzione potrebbe essere quella di memorizzare tutto in deposito sessione e quindi cancellarlo sul registro fuori:

sessionStorage.clear(); 
+6

L'uso di '$ window.location.reload()' fornisce una cattiva esperienza utente IMO. Non ho mai trovato un modo intelligente per farlo in modo che l'utente non veda la pagina caricata e poi ricarichi. – CodeTower

Problemi correlati