Tôi đã dành một chút thời gian để tìm ra cách tốt nhất để làm điều này là gì. Tôi cũng muốn giữ trạng thái, khi người dùng rời khỏi trang và sau đó nhấn nút quay lại, để quay lại trang cũ; và không chỉ đưa tất cả dữ liệu của tôi vào rootscope .
Kết quả cuối cùng là có một dịch vụ cho mỗi bộ điều khiển . Trong bộ điều khiển, bạn chỉ có các hàm và biến mà bạn không quan tâm, nếu chúng bị xóa.
Dịch vụ cho bộ điều khiển được tiêm bằng cách tiêm phụ thuộc. Vì các dịch vụ là singletons, dữ liệu của chúng không bị hủy như dữ liệu trong bộ điều khiển.
Trong dịch vụ, tôi có một mô hình. mô hình CHỈ có dữ liệu - không có chức năng -. Bằng cách đó, nó có thể được chuyển đổi qua lại từ JSON để duy trì nó. Tôi đã sử dụng lưu trữ cục bộ html5 cho sự kiên trì.
Cuối cùng tôi đã sử dụng window.onbeforeunload
và $rootScope.$broadcast('saveState');
để cho tất cả các dịch vụ biết rằng họ nên lưu trạng thái của mình và $rootScope.$broadcast('restoreState')
để cho họ biết để khôi phục trạng thái của họ (được sử dụng khi người dùng rời khỏi trang và nhấn nút quay lại để quay lại trang tương ứng).
Dịch vụ ví dụ được gọi là userService cho userControll của tôi :
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 dụ
function userCtrl($scope, userService) {
$scope.user = userService;
}
Chế độ xem sau đó sử dụng ràng buộc như thế này
<h1>{{user.model.name}}</h1>
Và trong mô-đun ứng dụng , trong phạm vi chức năng chạy i xử lý phát thanh truyền hình của saveState và 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');
};
Như tôi đã đề cập điều này phải mất một thời gian để đi đến điểm này. Đó là một cách rất sạch sẽ để làm điều đó, nhưng đó là một chút công bằng để làm một cái gì đó mà tôi nghi ngờ là một vấn đề rất phổ biến khi phát triển trong Angular.
Tôi rất muốn thấy dễ dàng hơn, nhưng là cách sạch để xử lý trạng thái trên các bộ điều khiển, kể cả khi người dùng rời khỏi và quay lại trang.
sessionStorage.restoreState
được đặt"true"
. Để có giải pháp chính xác để duy trì dữ liệu khi trang được làm mới, hãy xem tại đây . Để biết dữ liệu vẫn còn khi tuyến đường thay đổi, hãy xem câu trả lời của carloscarcamo. Tất cả bạn cần là đưa dữ liệu vào một dịch vụ.