मैं AngularJS में वर्तमान उपयोगकर्ता संदर्भ को कैसे संग्रहीत करूं?


92

मेरे पास एक AuthService है, जो एक उपयोगकर्ता में लॉग इन करता है, यह एक उपयोगकर्ता json ऑब्जेक्ट वापस करता है। मैं जो करना चाहता हूं, उस ऑब्जेक्ट को सेट करना है और पेज को रीफ्रेश किए बिना सभी परिवर्तनों को एप्लिकेशन (लॉग इन / लॉग आउट स्थिति) में प्रतिबिंबित किया गया है।

मैं इसे AngularJS के साथ कैसे पूरा करूंगा?

जवाबों:


180

इसे पूरा करने का सबसे आसान तरीका एक सेवा का उपयोग करना है। उदाहरण के लिए:

app.factory( 'AuthService', function() {
  var currentUser;

  return {
    login: function() { ... },
    logout: function() { ... },
    isLoggedIn: function() { ... },
    currentUser: function() { return currentUser; }
    ...
  };
});

फिर आप अपने किसी भी कंट्रोलर में इसका संदर्भ दे सकते हैं। निम्न कोड सेवा से एक मान में परिवर्तन के लिए देखता है (निर्दिष्ट फ़ंक्शन को कॉल करके) और फिर परिवर्तित मानों को दायरे में सिंक करता है।

app.controller( 'MainCtrl', function( $scope, AuthService ) {
  $scope.$watch( AuthService.isLoggedIn, function ( isLoggedIn ) {
    $scope.isLoggedIn = isLoggedIn;
    $scope.currentUser = AuthService.currentUser();
  });
});

और फिर, निश्चित रूप से, आप उस जानकारी का उपयोग कर सकते हैं, हालांकि आप फिट दिखते हैं; उदाहरणों में, टेम्प्लेट्स आदि में, आप इसे अपने मेनू कंट्रोलर आदि में दोहरा सकते हैं (अनुकूलित करने के लिए आपको क्या करना चाहिए) आदि। जब आप सेवा में स्थिति बदलते हैं, तो यह सब स्वचालित रूप से अपडेट हो जाएगा।

कुछ भी अधिक विशिष्ट आपके कार्यान्वयन पर निर्भर करता है।

उम्मीद है की यह मदद करेगा!


28
@ क्रिसचिकोला दरअसल, एंगुलरजेएस में सभी सेवाएं एकल हैं। इसलिए यह सेवा पहली बार बनाई गई है, जिसका अनुरोध किया गया है (अर्थात किसी नियंत्रक या किसी अन्य सेवा द्वारा) और इसके बाद के सभी अनुरोध उसी सटीक उदाहरण को वापस करते हैं।
जोश डेविड मिलर

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

7
यह एक मूर्खतापूर्ण प्रश्न हो सकता है ... लेकिन अगर उपयोगकर्ता पृष्ठ को ताज़ा करता है तो क्या होता है - क्या लॉगिन जानकारी खो गई है?
टॉम्बा

10
@ तोम्बा यह एक अच्छा सवाल है। :-) वास्तव में जानकारी ताज़ा होने पर खो जाती है। आमतौर पर, आप स्टोर करने के लिए चाहता हूँ कुछ एक कुकी में सत्र जानकारी। उस सत्र की जानकारी की जाँच भी की जा सकती है AuthService। यह न केवल पेज रिफ्रेश के लिए बल्कि किसी नए टैब में लिंक खोलने में मदद करता है।
जोश डेविड मिलर

2
@PixMach सीखने की अवस्था के बारे में आप 100% सही हैं। आपका प्रश्न बहुत विशिष्ट मामले पर निर्भर करने वाला है, लेकिन यहां कुछ सामान्य पैटर्न हैं। चिंताओं को अलग रखें: लॉगिन शुरू करने से संबंधित यूआई अपने आप में ऑर्कुट से अलग होती है, जो ऑर्ट की स्थिति से अलग होती है, जो कि किसी भी मेनू से अलग होती है, जो उक्त राज्य पर निर्भर हो सकती है। नव / मेनू को अक्सर एकल नियंत्रक द्वारा नियंत्रित किया जाता है, और नेस्टेड स्टेट्स (ए ला ui-router) और रूट रिज़ॉल्यूशन एक अच्छा तरीका है जिससे ऑरिजनल कंट्रोल DRY रखा जा सके। आपने जो लिखा है वह सही है।
जोश डेविड मिलर

5

मैं जोश की अच्छी प्रतिक्रिया को जोड़कर संशोधन करूंगा, क्योंकि एक प्रमाण के रूप में आम तौर पर किसी की भी दिलचस्पी होती है (जैसे, किसी को भी, लेकिन लॉगिन दृश्य गायब हो जाना चाहिए अगर कोई भी लॉग इन नहीं है), शायद एक सरल विकल्प का उपयोग करके इच्छुक पार्टियों को सूचित करना होगा $rootScope.$broadcast('loginStatusChanged', isLoggedIn);(1 ) (2), जबकि इच्छुक पक्ष (जैसे नियंत्रक) का उपयोग करते हुए सुनेंगे $scope.$on('loginStatusChanged', function (event, isLoggedIn) { $scope.isLoggedIn = isLoggedIn; }

(1) $rootScopeसेवा के तर्क के रूप में इंजेक्ट किया जा रहा है

(2) ध्यान दें कि, एक अतुल्यकालिक लॉगिन ऑपरेशन के संभावित मामले में, आप एंगुलर को सूचित करना चाहेंगे कि प्रसारण चीजों को बदल देगा, इसे एक $rootScope.$apply()फ़ंक्शन में शामिल करके ।

अब, उपयोगकर्ता संदर्भ को प्रत्येक / कई नियंत्रकों में रखने की बात करते हुए, आप उन सभी में लॉगिन परिवर्तनों के बारे में सुनकर खुश नहीं हो सकते हैं, और केवल सबसे ऊपरी लॉगिन नियंत्रक में सुनना पसंद कर सकते हैं, फिर अन्य लॉगिन-जागरूक नियंत्रकों को बच्चों के रूप में जोड़ सकते हैं / इस एक के एम्बेडेड नियंत्रक। इस तरह, बच्चे नियंत्रक विरासत में मिली पैतृक $ गुंजाइश गुण जैसे कि आपके उपयोगकर्ता संदर्भ को देख पाएंगे।


4
फैक्ट्री फ़ंक्शन के गलत स्पष्टीकरण के लिए डाउनवोट किया गया। आपके जवाब पोस्ट करने से पहले ही इस टिप्पणी में इस गलतफहमी को पहले ही संबोधित कर दिया गया था ।
Rhys van der Waerden
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.