Mi sono preso un po 'di tempo per capire qual è il modo migliore per farlo. Volevo anche mantenere lo stato, quando l'utente lascia la pagina e quindi preme il pulsante Indietro, per tornare alla vecchia pagina; e non solo mettere tutti i miei dati nel rootcope .
Il risultato finale è avere un servizio per ciascun controller . Nel controller, hai solo funzioni e variabili che non ti interessano, se vengono cancellate.
Il servizio per il controller viene iniettato tramite iniezione di dipendenza. Poiché i servizi sono singoli, i loro dati non vengono distrutti come i dati nel controller.
Nel servizio, ho un modello. il modello ha SOLO dati - nessuna funzione -. In questo modo può essere convertito avanti e indietro da JSON per persistere. Ho usato l'html5 localstorage per la persistenza.
Infine ho usato window.onbeforeunload
e $rootScope.$broadcast('saveState');
per far sapere a tutti i servizi che avrebbero dovuto salvare il loro stato, e $rootScope.$broadcast('restoreState')
per far loro sapere per ripristinare il loro stato (usato per quando l'utente lascia la pagina e preme il pulsante Indietro per tornare rispettivamente alla pagina).
Esempio di servizio chiamato userService per my userController :
app.factory('userService', ['$rootScope', function ($rootScope) {
var service = {
model: {
name: '',
email: ''
},
SaveState: function () {
sessionStorage.userService = angular.toJson(service.model);
},
RestoreState: function () {
service.model = angular.fromJson(sessionStorage.userService);
}
}
$rootScope.$on("savestate", service.SaveState);
$rootScope.$on("restorestate", service.RestoreState);
return service;
}]);
esempio userController
function userCtrl($scope, userService) {
$scope.user = userService;
}
La vista utilizza quindi l'associazione in questo modo
<h1>{{user.model.name}}</h1>
E nel modulo dell'app , all'interno della funzione di esecuzione gestisco la trasmissione di saveState e restoreState
$rootScope.$on("$routeChangeStart", function (event, next, current) {
if (sessionStorage.restorestate == "true") {
$rootScope.$broadcast('restorestate'); //let everything know we need to restore state
sessionStorage.restorestate = false;
}
});
//let everthing know that we need to save state now.
window.onbeforeunload = function (event) {
$rootScope.$broadcast('savestate');
};
Come ho già detto, ci è voluto un po 'per arrivare a questo punto. È un modo molto pulito di farlo, ma è un bel po 'di ingegneria fare qualcosa che sospetto sia un problema molto comune quando si sviluppa in Angular.
Mi piacerebbe vedere più facile, ma come modi chiari per gestire lo stato tra i controller, anche quando l'utente lascia e torna alla pagina.
sessionStorage.restoreState
è impostato"true"
. Per una soluzione corretta per conservare i dati quando la pagina si aggiorna, guarda qui . Per i dati persistenti quando il percorso cambia, guarda la risposta di Carloscarcamo. Tutto ciò che serve è mettere i dati in un servizio.