मुझे यह काम करने में थोड़ा समय लगा कि ऐसा करने का सबसे अच्छा तरीका क्या है। मैं यह भी रखना चाहता था कि जब उपयोगकर्ता पृष्ठ छोड़ता है और फिर वापस बटन दबाता है, तो पुराने पृष्ठ पर वापस जाने के लिए; और न केवल अपने सारे डेटा को रद्दी में डाल दिया ।
अंतिम परिणाम प्रत्येक नियंत्रक के लिए एक सेवा है । नियंत्रक में, आपके पास केवल फ़ंक्शंस और वैरिएबल होते हैं जिनकी आपको परवाह नहीं है, अगर वे साफ़ हो जाते हैं।
नियंत्रक के लिए सेवा निर्भरता इंजेक्शन द्वारा इंजेक्ट की जाती है। चूंकि सेवाएँ एकल हैं, उनका डेटा नियंत्रक में डेटा की तरह नष्ट नहीं होता है।
सेवा में, मेरे पास एक मॉडल है। मॉडल में केवल डेटा है - कोई कार्य नहीं -। इस तरह से इसे जारी रखने के लिए JSON से आगे और पीछे परिवर्तित किया जा सकता है। मैंने दृढ़ता के लिए html5 लोकलस्टोरेज का उपयोग किया।
अंत में मैंने उपयोग किया window.onbeforeunload
और $rootScope.$broadcast('saveState');
सभी सेवाओं को यह बताने के लिए कि उन्हें अपने राज्य को बचाना चाहिए, और $rootScope.$broadcast('restoreState')
उन्हें अपने राज्य को पुनर्स्थापित करने के लिए बताने के लिए इस्तेमाल किया (जब उपयोगकर्ता पृष्ठ छोड़ता है और पृष्ठ पर वापस लौटने के लिए वापस बटन दबाता है)।
उदाहरण सेवा बुलाया userService मेरे लिए 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 उदाहरण
function userCtrl($scope, userService) {
$scope.user = userService;
}
दृश्य तो इस तरह बंधन का उपयोग करता है
<h1>{{user.model.name}}</h1>
और ऐप मॉड्यूल में , रन फ़ंक्शन के भीतर मैं saveState और रिस्टोरस्ट के प्रसारण को संभालता हूं
$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');
};
जैसा कि मैंने बताया कि इस बिंदु पर आने में थोड़ा समय लगा। यह इसे करने का एक बहुत ही अच्छा तरीका है, लेकिन यह कुछ ऐसा करने के लिए इंजीनियरिंग का एक उचित सा है कि मुझे संदेह होगा कि कोणीय में विकसित होने पर यह एक बहुत ही सामान्य मुद्दा है।
मैं आसान देखना पसंद करूंगा, लेकिन उपयोगकर्ता के पेज पर वापस आने और वापस आने के दौरान नियंत्रकों के बीच स्थिति को संभालने के लिए स्वच्छ तरीके।
sessionStorage.restoreState
सेट किया गया है"true"
। पेज रीफ्रेश होने पर डेटा को बनाए रखने के लिए एक सही समाधान के लिए, यहां देखें । मार्ग में परिवर्तन होने पर डेटा को बनाए रखने के लिए, carloscarcamo के उत्तर को देखें। आपको बस एक सेवा में डेटा डालना है।