Saya mengambil sedikit waktu untuk mencari tahu apa cara terbaik untuk melakukan ini. Saya juga ingin mempertahankan status, ketika pengguna meninggalkan halaman dan kemudian menekan tombol kembali, untuk kembali ke halaman lama; dan tidak hanya memasukkan semua data saya ke rootscope .
Hasil akhirnya adalah memiliki layanan untuk setiap pengontrol . Di controller, Anda hanya memiliki fungsi dan variabel yang tidak Anda pedulikan, jika mereka dihapus.
Layanan untuk pengontrol disuntikkan dengan injeksi ketergantungan. Karena layanan adalah lajang, data mereka tidak dimusnahkan seperti data di controller.
Dalam layanan, saya punya model. model HANYA memiliki data - tidak ada fungsi -. Dengan begitu bisa dikonversi bolak-balik dari JSON untuk bertahan. Saya menggunakan penyimpanan lokal HTML5 untuk kegigihan.
Terakhir saya menggunakan window.onbeforeunload
dan$rootScope.$broadcast('saveState');
memberi tahu semua layanan bahwa mereka harus menyelamatkan negara mereka, dan $rootScope.$broadcast('restoreState')
membiarkan mereka tahu untuk memulihkan keadaan mereka (digunakan ketika pengguna meninggalkan halaman dan menekan tombol kembali untuk kembali ke halaman masing-masing).
Contoh layanan bernama userService untuk userController saya :
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;
}]);
contoh userController
function userCtrl($scope, userService) {
$scope.user = userService;
}
Tampilan kemudian menggunakan penjilidan seperti ini
<h1>{{user.model.name}}</h1>
Dan di modul aplikasi , dalam menjalankan fungsi saya menangani penyiaran dari saveState dan 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');
};
Seperti yang saya sebutkan ini butuh beberapa saat untuk sampai ke titik ini. Ini adalah cara yang sangat bersih untuk melakukannya, tetapi itu adalah sedikit rekayasa untuk melakukan sesuatu yang saya duga adalah masalah yang sangat umum ketika berkembang di Angular.
Saya ingin melihat lebih mudah, tetapi sebagai cara bersih untuk menangani menjaga status melintasi pengontrol, termasuk ketika pengguna pergi dan kembali ke halaman.
sessionStorage.restoreState
diatur"true"
. Untuk solusi yang benar untuk mempertahankan data saat halaman disegarkan, lihat di sini . Untuk data yang ada saat rute berubah, lihat jawaban carloscarcamo. Yang Anda butuhkan hanyalah memasukkan data ke dalam layanan.