Demorei um pouco para descobrir qual é a melhor maneira de fazer isso. Eu também queria manter o estado, quando o usuário sai da página e pressiona o botão Voltar, para voltar à página antiga; e não apenas colocar todos os meus dados no rootscope .
O resultado final é ter um serviço para cada controlador . No controlador, você apenas possui funções e variáveis com as quais não se importa, se elas estiverem limpas.
O serviço para o controlador é injetado por injeção de dependência. Como os serviços são singletons, seus dados não são destruídos como os dados no controlador.
No serviço, eu tenho um modelo. o modelo SOMENTE possui dados - sem funções -. Dessa forma, ele pode ser convertido para frente e para trás do JSON para persistir. Eu usei o armazenamento local html5 para persistência.
Por fim, usei window.onbeforeunloade $rootScope.$broadcast('saveState');avisei a todos os serviços que eles devem salvar seu estado e $rootScope.$broadcast('restoreState')avise-os para restaurar seu estado (usado para quando o usuário sai da página e pressiona o botão Voltar para retornar à página, respectivamente).
Exemplo de serviço chamado userService para meu 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;
}]);
exemplo userController
function userCtrl($scope, userService) {
$scope.user = userService;
}
A visualização então usa ligação como esta
<h1>{{user.model.name}}</h1>
E no módulo do aplicativo , dentro da função de execução, eu lida com a transmissão do 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');
};
Como mencionei, demorou um pouco para chegar a esse ponto. É uma maneira muito limpa de fazer isso, mas é um pouco de engenharia fazer algo que eu suspeitaria ser um problema muito comum no desenvolvimento em Angular.
Eu adoraria ver mais fácil, mas como maneiras limpas de lidar com a manutenção do estado entre controladores, inclusive quando o usuário sai e retorna à página.
sessionStorage.restoreStateestá definido"true". Para que uma solução correta persista os dados quando a página for atualizada, consulte aqui . Para dados persistentes quando a rota muda, veja a resposta de carloscarcamo. Tudo que você precisa é colocar os dados em um serviço.