J'ai pris un peu de temps pour déterminer quelle est la meilleure façon de procéder. Je voulais aussi conserver l'état, lorsque l'utilisateur quitte la page puis appuie sur le bouton retour, pour revenir à l'ancienne page; et pas seulement mettre toutes mes données dans le rootscope .
Le résultat final est d'avoir un service pour chaque contrôleur . Dans le contrôleur, vous n'avez que des fonctions et des variables dont vous ne vous souciez pas, si elles sont effacées.
Le service pour le contrôleur est injecté par injection de dépendances. Les services étant des singletons, leurs données ne sont pas détruites comme les données du contrôleur.
Dans le service, j'ai un modèle. le modèle a UNIQUEMENT des données - pas de fonctions -. De cette façon, il peut être converti d'avant en arrière à partir de JSON pour le conserver. J'ai utilisé le localstorage html5 pour la persistance.
Enfin, j'ai utilisé window.onbeforeunload
et $rootScope.$broadcast('saveState');
pour faire savoir à tous les services qu'ils doivent enregistrer leur état et $rootScope.$broadcast('restoreState')
pour leur faire savoir de restaurer leur état (utilisé lorsque l'utilisateur quitte la page et appuie sur le bouton retour pour revenir à la page respectivement).
Exemple de service appelé userService pour mon 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;
}]);
Exemple userController
function userCtrl($scope, userService) {
$scope.user = userService;
}
La vue utilise ensuite une liaison comme celle-ci
<h1>{{user.model.name}}</h1>
Et dans le module d'application , dans la fonction d'exécution, je gère la diffusion de saveState et de 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');
};
Comme je l'ai mentionné, cela a pris un certain temps pour arriver à ce point. C'est une façon très propre de le faire, mais c'est un peu d'ingénierie de faire quelque chose qui, à mon avis, est un problème très courant lors du développement en Angular.
J'adorerais voir des moyens plus simples, mais aussi propres, de gérer le maintien de l'état sur les contrôleurs, y compris lorsque l'utilisateur quitte et revient à la page.
sessionStorage.restoreState
est défini"true"
. Pour une solution correcte pour conserver les données lors de l'actualisation de la page, regardez ici . Pour des données persistantes lorsque l'itinéraire change, regardez la réponse de carloscarcamo. Tout ce dont vous avez besoin est de mettre les données dans un service.