2014-10-23 8 views
11

में लॉगआउट पर सेवाओं में क्लियरिंग डेटा के लिए सर्वोत्तम प्रथाएं मेरे पास कई सेवाएं हैं जो एक webservice का उपयोग करती हैं और बहुत सारे परिणामों को कैश करती हैं। कैशिंग द्वारा मेरा मतलब है सेवा पर एक चर में संग्रह करना। जब कोई उपयोगकर्ता डेटा लॉग आउट करता है तो उसे साफ़ किया जाना चाहिए। सेवाओं निम्नलिखित (सरलीकृत संस्करण) की तरह दिखता है:AngularJs

class DataService { 

    private data; 

    constructor($http) 
    { 
    $http.get(url).then((response) => 
     { 
      this.data = response.data; 
     }); 
    } 

}

कौन सा टाइपप्रति है, लेकिन कुछ इस तरह करने के लिए हल करता है:

var DataService = (function() { 
    function DataService($http) { 
     var _this = this; 
     $http.get(url).then(function (response) { 
      _this.data = response.data; 
     }); 
    } 
    return DataService; 
})(); 

मैं डेटा का उपयोग कर जवाब स्पष्ट कर सकता है This Question जो कुछ ऐसा कर रहा है:

$rootScope.on('logout',function(){ 
    this.data = []; 
}); 

हालांकि, यह बहुत सी कोड है जब हमारे पास कई सेवाएं और नियंत्रक हैं। और हम सभी जानते हैं कि यह नया लड़का किसी सेवा में कुछ नया डेटा जोड़ देगा और वह इसे लॉगआउट अनुक्रम में जोड़ना भूल जाएगा। यह बस एक बुरा अभ्यास है।

इसी तरह, डेटा के आवेदन के विभिन्न हिस्सों में डेटा स्कोप पर संग्रहीत किया जाता है और इसे भी साफ़ किया जाना चाहिए। दायरा इतना आसान है क्योंकि नियंत्रकों के लिए कन्स्ट्रक्टर प्रत्येक पृष्ठ विज़िट पर लोड होते हैं और फिर डेटा को ओवरराइड करेंगे।

एक प्रस्तावित समाधान ताज़ा करना है, हालांकि यह भयानक उपयोगकर्ता अनुभव देता है।

एक समाधान यह सुनिश्चित करने के लिए किया जा सकता है कि सेवाओं को कभी भी बनाया नहीं गया है या पूरी तरह से कोणीय पुनः लोड नहीं किया गया है।

ऐसा करने का सबसे अच्छा तरीका क्या है? क्या सेवाओं पर चर में डेटा स्टोर करना बुरा है?

+1

दिलचस्प सवाल:

इसके अलावा अपने संदर्भ के लिए इस सवाल का जवाब देखें। निश्चित रूप से * आपकी सभी सेवाओं में से सभी लॉग इन उपयोगकर्ता पर भरोसा नहीं करते हैं? टाइपस्क्रिप्ट यहां उपयोगी हो सकता है। आप एक इंटरफ़ेस को परिभाषित कर सकते हैं, 'ILoggedInUserService' कहें जो 'tearDown()' विधि का खुलासा करता है। इससे डेवलपर को सभी लागू सेवाओं के लिए इस विधि को लागू करने के लिए मजबूर किया जाएगा। फिर आप [enumerate] (http://stackoverflow.com/questions/19411502/angular-get-list-of-all-registered-services) कर सकते हैं और लॉग आउट पर निष्पादित कर सकते हैं – CodingIntrigue

+5

मैं किसी ईवेंट को प्रसारित करके इसके साथ सौदा करता हूं, और सभी प्रासंगिक सेवाएं उस घटना को सुनकर अपने डेटा को साफ करती हैं।यह कोड को किसी भी अंतर-निर्भरता के साथ साफ रखता है। – harishr

उत्तर

9

आप एक सेवा बना सकते हैं जो अन्य सेवाओं से सभी डेटा को साफ़ करने के लिए ज़िम्मेदार है। इस मामले में आपको केवल इस सेवा के "clear" विधि को कॉल करना होगा, और इस के अंदर व्यक्तिगत स्पष्ट कॉल लागू करना होगा (इसलिए केवल एक बार लागू किया गया)।

यह आपको यह भी लाभ देता है कि आपके पास इस बारे में एक सिंहावलोकन है कि कौन से सेवा डेटा को हर समय साफ़ करने की आवश्यकता है, क्योंकि भविष्य में आपके पास अपवाद हो सकते हैं। Injecting a service into another service in angularJS

+0

आपको अभी भी व्यक्तिगत डेटा निर्दिष्ट करने की आवश्यकता है, जब तक कि हम प्रत्येक सेवा डेटा को प्रत्येक सेवा के लिए एक अलग ऑब्जेक्ट में संग्रहीत न करें। फिर इस वस्तु को हटाने से इसे साफ़ कर दिया जाएगा। – CodeTower

+0

@ कबाहांगो, क्या आप इस संपत्ति को रीसेट करने के लिए हर संपत्ति निर्दिष्ट किए बिना इस तरह से बाहर निकलने का तरीका समझते हैं? मुझे लगता है कि खिड़की रीलोड विकल्प शायद इससे बेहतर विकल्प है। – m0g

+0

बिल्कुल नहीं। लेकिन एक अच्छा तरीका "रिपोजिटरी पैटर्न" बनाना है जैसे कि आपके ऐप में मौजूद सभी डेटा एक या अधिक भंडारों में संग्रहीत किया जाता है। यह एक कामकाज नहीं है, लेकिन यह एक अच्छा डिजाइन पैटर्न है। – CodeTower

4

आप एक पूरा पृष्ठ ताज़ा उपयोग कर सकते हैं:

$window.location.reload(); 

यह आपके आवेदन

के पूरे राज्य को पुनः आरंभ करेगा एक और समाधान सत्र भंडारण में सब कुछ और लॉग बाहर पर तो यह स्पष्ट स्टोर करने के लिए हो सकता है:

sessionStorage.clear(); 
+6

'$ window.location.reload()' का उपयोग करके खराब उपयोगकर्ता अनुभव आईएमओ देता है। मुझे कम से कम एक चालाक मूर्खतापूर्ण तरीका नहीं मिला है जहां उपयोगकर्ता पेज लोड नहीं देखता है और फिर यह पुनः लोड होता है। – CodeTower