Bunu yapmanın en iyi yolunu bulmak için biraz zaman ayırdım. Ayrıca, kullanıcı sayfadan ayrıldıktan sonra geri düğmesine bastığında, eski sayfaya geri dönmek için durumu korumak istedim; ve tüm verilerimi anaç içine koymakla kalmadı .
Nihai sonuç, her denetleyici için bir hizmete sahip olmaktır . Denetleyicide, temizlenmişse, umursamadığınız işlevler ve değişkenler vardır.
Kontrolör servisi bağımlılık enjeksiyonu ile enjekte edilir. Hizmetler tekil olduğundan, denetleyicideki veriler gibi verileri yok edilmez.
Hizmette bir modelim var. SADECE model veri içerir - işlev yok -. Bu şekilde, devam etmek için JSON'dan ileri geri dönüştürülebilir. Kalıcılık için html5 localstorage kullandım.
Son olarak kullandım window.onbeforeunload
ve $rootScope.$broadcast('saveState');
tüm hizmetlerin durumlarını kaydetmeleri gerektiğini $rootScope.$broadcast('restoreState')
bilmesini ve durumlarını geri yüklemelerini bilmelerini sağlamak için (kullanıcı sayfadan ayrıldığında ve sayfaya geri dönmek için geri düğmesine bastığında kullanılır).
Denilen Örnek servisi userService benim için 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 örneği
function userCtrl($scope, userService) {
$scope.user = userService;
}
Görünüm daha sonra böyle bir bağlama kullanır
<h1>{{user.model.name}}</h1>
Ve de uygulama modülü , çalışma fonksiyonu içinde i idare yayın arasında Savestate ve 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');
};
Dediğim gibi bu noktaya gelmek biraz zaman aldı. Bunu yapmanın çok temiz bir yoludur, ancak Angular'da gelişirken çok yaygın bir sorun olduğundan şüphelendiğim bir şey yapmak oldukça makul bir mühendisliktir.
Daha kolay görmek isterim, ancak kullanıcının sayfadan ayrılıp sayfaya geri dönmesi de dahil olmak üzere durumu denetleyiciler arasında tutmanın temiz yolları olarak görmek isterim.
sessionStorage.restoreState
olarak ayarlandığını göstermez"true"
. Sayfa yenilendiğinde verilerin saklanmasına yönelik doğru bir çözüm için buraya bakın . Rota değiştiğinde kalıcı veriler için carloscarcamo'nun cevabına bakın. Tek ihtiyacınız olan verileri bir hizmete sokmak.