У мене було небагато часу, щоб розібратися, який найкращий спосіб зробити це. Я також хотів зберегти стан, коли користувач залишає сторінку та натискає кнопку назад, щоб повернутися до старої сторінки; а не просто вносити всі мої дані в кореневу зону .
Кінцевим результатом є надання сервісу для кожного контролера . У контролері у вас просто є функції та змінні, про які ви не дбаєте, якщо вони будуть очищені.
Служба для контролера вводиться шляхом введення залежності. Оскільки служби є одинаковими, їх дані не знищуються, як дані в контролері.
У сервісі у мене є модель. модель САМО має дані - немає функцій -. Таким чином він може бути перетворений назад і назад від JSON, щоб зберегти його. Я використовував html5 localstorage для наполегливості.
Нарешті, я використав window.onbeforeunloadі $rootScope.$broadcast('saveState');дав всім службам знати, що вони повинні зберегти свій стан, і $rootScope.$broadcast('restoreState')повідомити їм про відновлення свого стану (використовується для того, коли користувач залишає сторінку та натискає кнопку назад, щоб повернутися на сторінку відповідно).
Приклад служби під назвою userService для мого користувачаController :
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". Щоб правильне рішення зберегло дані під час оновлення сторінки, дивіться тут . Щоб зберегти дані, коли маршрут змінюється, подивіться відповідь карлоскаркамо. Все, що вам потрібно - це помістити дані в сервіс.