2013-08-07 5 views
6

को सत्यापित करने के लिए इसका उपयोग करने की आवश्यकता है, मैंने बाकी सेवा पर कॉल करने के लिए रेस्टैंगुलर पर ठोकर खाई है। यह बहुत अच्छा काम करता है और एक वादा देता है। मुझे कॉल ब्लॉक करने में सक्षम होना चाहिए। इसका कारण ताजा पृष्ठ रीलोड पर है, मैं तकनीकी रूप से लॉग इन नहीं कर रहा हूं लेकिन मेरे पास एक कुकी में संग्रहीत टोकन हो सकता है। मैं एक बाकी सेवा के खिलाफ इस टोकन को मान्य करना चाहता हूं। समस्या यह है कि मुझे इसे अवरुद्ध करने की आवश्यकता है।कोणीयजेएस (पुनर्विक्रेता): एक वादा ब्लॉक बनाना? टोकन

यदि कोई टाइमआउट होता है या यदि यह मान्य नहीं है कि मैं teh उपयोगकर्ता को प्रमाणित नहीं कर सकता हूं।

ब्लॉक करने की इच्छा यही कारण है कि मैं उन्हें एक नए URL पर $ location.path का उपयोग करके रीडायरेक्ट करना चाहता हूं, यह मान्य टोकन नहीं है।

यह एक विशिष्ट मार्ग पर नहीं होता है इसलिए मैं अवरुद्ध करने वाले संकल्प का उपयोग नहीं कर सकता। यह तकनीकी रूप से हर मार्ग पर होता है - मैं $ $ का उपयोग करता हूं। चेंजस्टार्ट और एक आंतरिक चर की जांच करें लॉग इनइन या नहीं, अगर लॉग इन नहीं किया गया है तो मैं संग्रहीत टोकन की जांच करता हूं।

यह प्रत्येक पृष्ठ रीफ्रेश पर होता है लेकिन एप्लिकेशन के अंदर नेविगेट करते समय नहीं।

जिस प्रभाव को मैं प्राप्त करने की कोशिश कर रहा हूं वह यह है कि जीमेल कैसे काम करता है।

किसी भी अंतर्दृष्टि किसी को देखो आगे पर इस

धन्यवाद

उत्तर

8

असल में आपको यह सुनिश्चित करने की ज़रूरत है कि किसी भी मार्ग परिवर्तन से पहले कुछ असीमित कार्रवाई होती है, और इस मामले में कार्रवाई उपयोगकर्ता को प्रमाणित कर रही है।

function authenticate() { 
    if (user.isAuthenticated) { 
     return; 
    } 
    // Just fake it, but in a real app this might be an ajax call or something 
    return $timeout(function() { 
     user.isAuthenticated = true; 
    }, 3000); 
} 

$rootScope.$on("$routeChangeStart", function(e, next) { 
    console.log("$routeChangeStart"); 
    next.resolve = angular.extend(next.resolve || {}, { 
     __authenticating__: authenticate 
    }); 
}); 

कोणीय के बाद से करने के लिए resolve वस्तु में कोई वादा के लिए इंतजार करेंगे:

आप क्या कर सकते तो जैसे मार्ग पर resolve वस्तु में कोई प्रॉपर्टी जोड़ते को $routeChangeStart घटना इसी क्रम में उत्सर्जित है का उपयोग करें आगे बढ़ने से पहले पूरा हो जाएं, उदाहरण के तौर पर आप केवल छद्म निर्भरता का उपयोग कर सकते हैं। इस तरह कुछ का उपयोग करके, आपको यह गारंटी देने में सक्षम होना चाहिए कि आपका उपयोगकर्ता सफलतापूर्वक निष्पादित किसी भी मार्ग से पहले प्रमाणीकरण कर रहा है।

उदाहरण: http://jsfiddle.net/hLddM/

+0

अच्छा !, यह वही था जो मैं ढूंढ रहा था। – Martin

0

मैं सबसे अच्छा तरीका यह करने के लिए $ location.path के साथ चारों ओर उपयोगकर्ता पुश करने के लिए, आप उपयोग कर सकते हैं तो फिर हो सकता है लगता है है() उपयोगकर्ता को लोडिंग पृष्ठ पर छोड़कर प्रभावी रूप से प्रतीक्षा करने के लिए मजबूर होना।

var currentPath = $location.path(); 

$location.path(loadingScreen); 

//Assuming you have some sort of login function for ease. 
Restangular.login(token).then(
    function(result) { 
     $location.path(currentPath) 
    }, 
    function(error) { 
     $location.path(logInScreen) 
    } 
); 
+0

धन्यवाद मैट, कि मैं क्या जरूरत थी लेकिन $ location.path (loadingScreen) ब्राउज़र के एड्रेस बार बदल जाएगा तरह लग रहा था। वैसे भी इस दौर? – Martin

0

आप ui रूटर का उपयोग कर रहे हैं, तो आप उसी यूआरएल आप उपयोग करेंगे जहां तो साथ कि Restangular.login के साथ एक और राज्य पर चला जाता, और सफलता के मामले में करने के लिए वापस जाने के लिए " "स्थिति में लॉग इन करें, अन्यथा," लॉग इन "स्थिति पर जाएं जहां उपयोगकर्ता को अपना उपयोगकर्ता नाम और पासवर्ड दर्ज करना होगा।

यदि आप यूई-राउटर का उपयोग नहीं कर रहे हैं, तो आप कुछ ng-switch के साथ ऐसा कुछ कार्यान्वित कर सकते हैं।

तो, स्क्रीन पर आने पर, आप Restangular.login करते हैं और डिफ़ॉल्ट रूप से आप कुछ बुलियन को सही पर सेट करके लोडिंग पृष्ठ दिखाते हैं। फिर, अगर यह सफल नहीं होता है, तो आप उसे लॉगिन में भेजते हैं, अन्यथा, आप झूठी लोडिंग सेट करते हैं और पेज दिखाते हैं।

वैसे भी, मैं दृढ़ता से ui-राउटर का उपयोग कर, यह चट्टानों :)

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

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