2013-01-08 13 views
89

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

मैं कैसे AngularJS के साथ यह पूरा होगा?

उत्तर

177

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

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(); 
    }); 
}); 

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

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

आशा है कि इससे मदद मिलती है!

+1

है यही कारण है कि मैं भी सोच रहा था, लेकिन मैं उत्सुक कैसे कारखाने में काम करता है हूँ। जब भी नियंत्रक बनाया जाता है और AuthService के लिए पूछता है, तो क्या हमें एक अलग वर्तमान उपयोगकर्ता संदर्भ नहीं मिलेगा? शायद मैं इस बात पर स्पष्ट नहीं हूं कि कोणीय कैसे चीजों को हुक करता है। आदर्श रूप में हमारे पास एक संदर्भ होगा। एक विकल्प के रूप में मैं ngCookies स्टोर (मेरा पसंदीदा विचार नहीं) या ब्राउज़र भंडारण (अभी तक समर्थित नहीं है) का उपयोग करने के बारे में सोच रहा था। –

+28

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

+0

@JoshDavidMiller आपके पास एक फ़ंक्शन के रूप में 'isLoggedIn' प्रॉपर्टी है? क्या वह बुलियन नहीं होगा? – nicholas

5

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

(1) $rootScope सेवा के एक तर्क के रूप इंजेक्शन जा रहा

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

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

+4

फ़ैक्टरी फ़ंक्शन के गलत स्पष्टीकरण के लिए डाउनवॉटेड। इस गलतफहमी को पहले से ही [इस टिप्पणी] में संबोधित किया गया था (http://stackoverflow.com/questions/14206492/how-do-i-store-a-current-user-context-in-angular/14206567#comment20831205_14206567) महीने पहले आपका जवाब पोस्ट किया। –

संबंधित मुद्दे