Me tomé un poco de tiempo para averiguar cuál es la mejor manera de hacerlo. También quería mantener el estado, cuando el usuario abandona la página y luego presiona el botón Atrás, para volver a la página anterior; y no solo poner todos mis datos en el rootcope .
El resultado final es tener un servicio para cada controlador . En el controlador, solo tiene funciones y variables que no le importan, si se borran.
El servicio para el controlador se inyecta por inyección de dependencia. Como los servicios son singletons, sus datos no se destruyen como los datos en el controlador.
En el servicio, tengo un modelo. el modelo SOLO tiene datos, sin funciones. De esa manera, se puede convertir de JSON de un lado a otro para mantenerlo. Usé el almacenamiento local html5 para persistencia.
Por último, utilicé window.onbeforeunloady $rootScope.$broadcast('saveState');para que todos los servicios sepan que deben guardar su estado, y $rootScope.$broadcast('restoreState')para que sepan cómo restaurar su estado (utilizado cuando el usuario abandona la página y presiona el botón Atrás para volver a la página respectivamente).
Ejemplo de servicio llamado userService para mi 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;
}]);
ejemplo de userController
function userCtrl($scope, userService) {
$scope.user = userService;
}
La vista usa un enlace como este
<h1>{{user.model.name}}</h1>
Y en el módulo de la aplicación , dentro de la función de ejecución, manejo la transmisión de saveState y 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');
};
Como mencioné, esto tomó un tiempo para llegar a este punto. Es una forma muy limpia de hacerlo, pero es un poco de ingeniería hacer algo que sospecho que es un problema muy común cuando se desarrolla en Angular.
Me encantaría ver más fácilmente, pero como formas limpias de manejar el mantenimiento del estado en todos los controladores, incluso cuando el usuario se va y vuelve a la página.
sessionStorage.restoreStateestá configurado"true". Para obtener una solución correcta para conservar los datos cuando se actualiza la página, mira aquí . Para datos persistentes cuando la ruta cambia, mire la respuesta de carloscarcamo. Todo lo que necesita es poner los datos en un servicio.