Ich habe mir ein bisschen Zeit genommen, um herauszufinden, wie das am besten geht. Ich wollte auch den Status beibehalten, wenn der Benutzer die Seite verlässt und dann die Zurück-Taste drückt, um zur alten Seite zurückzukehren. und nicht nur alle meine Daten in das Rootscope legen .
Das Endergebnis ist ein Service für jeden Controller . In der Steuerung haben Sie nur Funktionen und Variablen, die Sie nicht interessieren, wenn sie gelöscht werden.
Der Dienst für die Steuerung wird durch Abhängigkeitsinjektion injiziert. Da Dienste Singletons sind, werden ihre Daten nicht wie die Daten in der Steuerung zerstört.
Im Service habe ich ein Modell. Das Modell hat NUR Daten - keine Funktionen -. Auf diese Weise kann es von JSON hin und her konvertiert werden, um es beizubehalten. Ich habe den HTML5-Localstorage für die Persistenz verwendet.
Zuletzt habe ich verwendet window.onbeforeunload
und $rootScope.$broadcast('saveState');
alle Dienste wissen lassen, dass sie ihren Status speichern sollen, und $rootScope.$broadcast('restoreState')
um sie wissen zu lassen , dass sie ihren Status wiederherstellen sollen (wird verwendet, wenn der Benutzer die Seite verlässt und die Zurück-Taste drückt, um jeweils zur Seite zurückzukehren).
Beispieldienst namens userService für meinen 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 Beispiel
function userCtrl($scope, userService) {
$scope.user = userService;
}
Die Ansicht verwendet dann eine solche Bindung
<h1>{{user.model.name}}</h1>
Und im App-Modul kümmere ich mich innerhalb der Ausführungsfunktion um die Übertragung von saveState und 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');
};
Wie ich bereits erwähnte, dauerte es eine Weile, bis dieser Punkt erreicht war. Es ist eine sehr saubere Art, dies zu tun, aber es ist ein gutes Stück Technik, etwas zu tun, von dem ich vermuten würde, dass es ein sehr häufiges Problem bei der Entwicklung in Angular ist.
Ich würde es gerne einfacher sehen, aber als saubere Möglichkeit, den Status zwischen den Controllern beizubehalten, auch wenn der Benutzer die Seite verlässt und zur Seite zurückkehrt.
sessionStorage.restoreState
ist"true"
. Eine korrekte Lösung zum Beibehalten von Daten beim Aktualisieren der Seite finden Sie hier . Informationen zu dauerhaften Daten, wenn sich die Route ändert, finden Sie in der Antwort von carloscarcamo. Sie müssen lediglich die Daten in einen Dienst stellen.