Я потратил немного времени, чтобы понять, как это лучше всего сделать. Я также хотел сохранить состояние, когда пользователь покидает страницу и затем нажимает кнопку «Назад», чтобы вернуться на старую страницу; а не просто положить все мои данные в корневой каталог .
Конечный результат - иметь сервис для каждого контроллера . В контроллере просто есть функции и переменные, которые вам не нужны, если они очищены.
Служба для контроллера вводится путем внедрения зависимостей. Поскольку сервисы являются одиночными, их данные не уничтожаются, как данные в контроллере.
В сервисе у меня есть модель. модель ТОЛЬКО имеет данные - никаких функций -. Таким образом, он может быть преобразован назад и вперед из JSON, чтобы сохранить его. Я использовал html5 localalstorage для настойчивости.
Наконец, я использовал window.onbeforeunload
и, $rootScope.$broadcast('saveState');
чтобы все службы знали, что они должны сохранить свое состояние, и $rootScope.$broadcast('restoreState')
чтобы они знали, чтобы восстановить свое состояние (используется, когда пользователь покидает страницу и нажимает кнопку «Назад», чтобы вернуться на страницу соответственно).
Пример сервиса под названием userService для моего 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;
}]);
пример userController
function userCtrl($scope, userService) {
$scope.user = userService;
}
Затем представление использует привязку, как это
<h1>{{user.model.name}}</h1>
А в модуле приложения , в функции запуска я обрабатывать вещание в saveState и 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');
};
Как я уже говорил, это заняло некоторое время, чтобы прийти к этой точке. Это очень чистый способ сделать это, но это довольно трудоемкая разработка, чтобы сделать что-то, что, как я подозреваю, является очень распространенной проблемой при разработке в Angular.
Я хотел бы видеть проще, но как чистые способы обработки состояния на контроллерах, в том числе когда пользователь уходит и возвращается на страницу.
sessionStorage.restoreState
установлено"true"
. Чтобы найти правильное решение для сохранения данных при обновлении страницы, посмотрите здесь . Для получения постоянных данных при изменении маршрута посмотрите ответ Карлоскаркамо. Все, что вам нужно, это поместить данные в сервис.