2011-05-27 22 views
36

क्या backbone.js द्वारा निष्पादित AJAX अनुरोधों के लिए एक त्रुटि हैंडलर को बांधने का कोई तरीका है?backbone.js AJAX अनुरोधों के लिए वैश्विक त्रुटि हैंडलर

मेरी स्थिति: मुझे किसी भी समय 401 (अनधिकृत) मिल सकता है, इसलिए मुझे लॉगिन पॉपअप दिखाना होगा।

उत्तर

24

इसके लिए सीधे jQuery का उपयोग करें।

$(document).ajaxError(function (e, xhr, options) { 
    // do your stuff 
}); 

आप उदाहरण के लिए रेल में सीएसआरएफ के लिए एक ही चीज कर सकते हैं (AJAXSend का उपयोग करके)।

आप यहाँ और अधिक पढ़ सकते हैं: http://api.jquery.com/jQuery.ajax#advanced-options

+7

ध्यान दें कि यह कॉलबैक सभी jQuery AJAX त्रुटियों के लिए निष्पादित होगा, न कि केवल रीढ़ की हड्डी के अनुरोध से संबंधित। पेज में अन्य पुस्तकालयों में jquery के माध्यम से AJAX अनुरोध कर सकते हैं, शायद आप उन मामलों में कॉलबैक नहीं चाहते हैं। – cerberos

+1

एचएम, यह एक बहुत ही वैश्विक तरीका है ... – wik

+3

ग्लोबल AJAXError कॉलबैक का उपयोग करने का यह तरीका बैकबोन मॉडल/संग्रह के साथ काम नहीं करता है अगर fetch, sync, create विधियों में विकल्प के रूप में प्रदान की गई त्रुटि कॉलबैक होती है। –

25

बैकबोन की सिंक त्रुटियों के दौरान 'त्रुटि' ईवेंट ट्रिगर करती है। तो इन ऐड-ऑन त्रुटि जांच को जोड़ने के लिए आप एक दृष्टिकोण ले सकते हैं बैकबोन के मॉडल और संग्रह ऑब्जेक्ट्स को विस्तारित करना। यह कुछ ऐसा दिखाई देगा:

ErrorHandlingModel = Backbone.Model.extend({ 

    initialize: function(attributes, options) { 
     options || (options = {}); 
     this.bind("error", this.defaultErrorHandler); 
     this.init && this.init(attributes, options); 
    }, 

    defaultErrorHandler: function(model, error) { 
     if (error.status == 401 || error.status == 403) { 
      // trigger event or route to login here. 
     } 
    } 

}); 

OtherModel = ErrorHandlingModel.extend({ 
}); 

और आप संग्रह ऑब्जेक्ट के लिए कुछ ऐसा करेंगे। मैंने उपर्युक्त परीक्षण नहीं किया है, लेकिन यह बहुत करीब लगता है। जाहिर है, आप बेहतर वर्ग के नाम चुनेंगे। इनिट विधि केवल उप-वर्गों को अपना प्रारंभिक करने का मौका पाने में सक्षम बनाता है।

+4

क्या मॉडल को वास्तव में 401 अनधिकृत संभाल करने के लिए कार्य किया जाना चाहिए? – Ben

+0

अच्छा सवाल। हमने पूरी तरह से ऐसा किया क्योंकि मॉडल और संग्रह सर्वर के लिए हमारे अनुकूल थे। यह परंपरागत रूप से किसी मॉडल जैसी चीज़ को असाइन की गई ज़िम्मेदारी की तरह प्रतीत नहीं होता है, इसलिए शायद एक बेहतर तरीका है। मई में वापस, प्रतिबिंबित करने के लिए बहुत पहले कला नहीं थी, इसलिए यह वह दृष्टिकोण है जिसके साथ हम आए थे। –

+0

मेरे लिए काम नहीं किया। –

15

मैं क्या पाया संभवतः "सबसे सही तरीके से" रीढ़ में है:

var GeneralErrorView = Backbone.View.extend({ 
    events: { 
    'ajaxError': 'handleAjaxError' 
    }, 
    handleAjaxError: function (event, request, settings, thrownError) { 
    //...handling goes here 
    } 
}); 

this.view = GeneralErrorView({el: document}); 

आप मॉडल या संग्रह के विस्तार के बिना तर्क से निपटने किसी भी त्रुटि डाल सकते हैं। हैंडलर के अंदर बैकबोन.इवेंट्स का उपयोग करें और संदेशों को अन्य त्रुटि हैंडलर या उस तरह से कुछ प्रेषित करें।

+0

चालाक दृष्टिकोण! –

+0

यह काम करता है, हालांकि अनुरोध, सेटिंग्स, फेंक दिया गया है जब सर्वर से 500 त्रुटि मिली है तो त्रुटि पैरामीटर सभी अपरिभाषित हैं। अगर मुझे त्रुटि के बारे में जानकारी नहीं मिली तो मैं वास्तव में इस समाधान का उपयोग नहीं कर सकता। क्या मैंने कुछ गलत किया? –

+0

यह पुराना हो सकता है क्योंकि मैंने लगभग दो साल पहले इसका इस्तेमाल किया था, आपको यह जांचना होगा कि कॉलबैक में कुछ भी पास हो गया है –

10

आप इसे jQuery .ajaxSetup विधि के माध्यम से संभाल सकते हैं। हम एक समान स्थिति (रीढ़ की हड्डी एप्लिकेशन जो किसी भी समय एक 401 त्रुटि प्राप्त कर सकते हैं) है और हम हमारे अनुप्रयोग के प्रवेश बिंदु में jQuery के ajaxSetup का उपयोग करके इसे संभाल:

var appView = new AppView(options); 

$.ajaxSetup({ 
    cache: false, 
    statusCode: { 
     401: function() { 
      appView.signIn(); 
     } 
    } 
}); 

appView.render(); 

Backbone.history.start({ root: config.rootUrl, pushState: true }); 

यह दृष्टिकोण वैश्विक त्रुटि की आवश्यकता के बिना निपटने देता है बैकबोन बेस कक्षाओं का विस्तार करने के लिए।

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