मैंने यह करने के लिए कुछ समय लगाया कि ऐसा करने का सबसे अच्छा तरीका क्या है। मैं राज्य को रखना चाहता था, जब उपयोगकर्ता पृष्ठ छोड़ देता है और फिर पुराने पृष्ठ पर वापस जाने के लिए बैक बटन दबाता है; और न केवल मेरे सभी डेटा को जड़कोप में डालें।
अंतिम परिणाम प्रत्येक नियंत्रक के लिए एक सेवा है। नियंत्रक में, आपके पास केवल फ़ंक्शंस और चर होते हैं जिन पर आप परवाह नहीं करते हैं, अगर उन्हें साफ़ किया जाता है।
नियंत्रक के लिए सेवा निर्भरता इंजेक्शन द्वारा इंजेक्शन दी जाती है। चूंकि सेवाएं सिंगलेट हैं, इसलिए उनका डेटा नियंत्रक में डेटा की तरह नष्ट नहीं होता है।
सेवा में, मेरे पास एक मॉडल है। मॉडल में केवल डेटा है - कोई फ़ंक्शन नहीं -। इस तरह इसे जेएसओएन से आगे बढ़ने के लिए इसे आगे बढ़ाया जा सकता है। मैंने दृढ़ता के लिए एचटीएमएल 5 स्थानीय स्टोरेज का इस्तेमाल किया।
अन्त में मैं window.onbeforeunload
और $rootScope.$broadcast('saveState');
इस्तेमाल किया जाने के लिए सभी सेवाओं को पता है कि वे अपने राज्य को बचाने के लिए करना चाहिए, और $rootScope.$broadcast('restoreState')
उन्हें अपने राज्य (जब उपयोगकर्ता पृष्ठ छोड़ के लिए इस्तेमाल किया बहाल करने के लिए यह बताने के लिए और करने के लिए वापस जाने के लिए वापस बटन दबाता है क्रमशः पृष्ठ)।
उदाहरण सेवा मेरी userController के लिए userService कहा जाता है:
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 की और 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');
};
के रूप में मैं इस इस मुद्दे पर आने के लिए कुछ समय लिया उल्लेख संभाल। यह करने का यह एक बहुत ही साफ तरीका है, लेकिन ऐसा कुछ करने के लिए इंजीनियरिंग का एक उचित हिस्सा है जिसे मैं संदिग्ध में विकसित करते समय एक बहुत ही आम मुद्दा मानता हूं।
मुझे आसान दिखना अच्छा लगेगा, लेकिन जब उपयोगकर्ता छोड़ देता है और पेज पर वापस आ जाता है, तब भी राज्य को नियंत्रकों को रखने के लिए साफ तरीके के रूप में। मैं कई दृश्यों के साथ एक स्पा है :
यह बताता है कि पेज रीफ्रेश होने पर डेटा को कैसे बनाए रखना है, मार्ग बदलने पर इसे कैसे बनाए रखना है, इसलिए यह सवाल का जवाब नहीं देता है। इसके अलावा यह उन ऐप्स के लिए काम नहीं करेगा जो मार्गों का उपयोग नहीं करते हैं। इसके अलावा यह नहीं दिखाता है कि 'sessionStorage.restoreState'' सत्य पर सेट किया गया है। पृष्ठ रीफ्रेश होने पर डेटा को बनाए रखने के लिए एक सही समाधान के लिए, [यहां] देखें (http://stackoverflow.com/questions/25428170/angular-restore-scope-from- सत्रस्थान /25430797)। मार्ग बदलते समय लगातार डेटा के लिए, कार्लोस्कार्को के जवाब को देखें। आपको केवल एक सेवा में डेटा रखना है। –
यह विचारों में लगातार रहता है, वैसे ही जैसा कि आप सुझाव देते हैं, इसे एक सेवा में स्टोर करें। दिलचस्प रूप से पर्याप्त है, यह एक पेज पर भी जारी रहता है उसी तरह से आप खिड़की के साथ सुझाव हैं .onbeforeunload। हालांकि मुझे डबल चेक बनाने के लिए धन्यवाद। यह उत्तर एक वर्ष से अधिक पुराना है और यह अभी भी कोणीय के साथ चीजों को करने का सबसे आसान तरीका प्रतीत होता है। – Anton
यहां वापस आने के लिए धन्यवाद, भले ही यह पुराना हो :)। निश्चित रूप से आपके समाधान में दोनों विचार और पृष्ठ शामिल हैं, लेकिन यह नहीं बताता कि कौन सा कोड किस उद्देश्य से कार्य करता है, और [यह पर्याप्त नहीं है कि यह उपयोग योग्य हो सकता है] (http://stackoverflow.com/questions/25428170/angular-restore- गुंजाइश-से-sessionstorage/25,430,797)। मैं केवल पाठकों को [आगे के प्रश्न] से बचने के लिए चेतावनी दे रहा था (http://stackoverflow.com/questions/25428170/angular-restore-scope-from-essionstorage/25430797)। यह अच्छा होगा अगर आपके पास अपने उत्तर को बेहतर बनाने के लिए संपादन करने का समय हो। –