2011-09-16 18 views
8

में महत्वपूर्ण मूल्य जोड़ी पैराम हैंडलिंग मैं बैकबोन मार्गों पर पैराम के रूप में महत्वपूर्ण मान जोड़े को पास करना चाहता हूं और मैप किए गए फ़ंक्शन को कॉल करने से पहले इसे जावास्क्रिप्ट ऑब्जेक्ट में deserialized करना चाहता हूं।बैकबोन.जेएस राउटर

var MyRouter = Backbone.Router.extend({ 
    routes: { 
    "dashboard?:params" : "show_dashboard" 
    }, 
    show_dashboard: function(params){ 
    console.log(params); 
    } 
}); 

जब मैं जाने के लिए: "http //...#dashboard कुंजी 1 = VAL1 & कुंजी 2 = val2?" तो {कुंजी 1: "VAL1", कुंजी 2: "val2"} पर मुद्रित किया जाना चाहिए कंसोल।

वर्तमान में deserialized ऑब्जेक्ट पर प्राप्त करने के लिए प्रत्येक मैप किए गए फ़ंक्शन के अंदर jQuery BBQ की $ .deparam विधि का उपयोग कर रहा हूं। यह अच्छा होगा अगर मैं राउटर का विस्तार कर सकता हूं और इसे एक बार परिभाषित कर सकता हूं ताकि ऑब्जेक्ट के रूप में सभी मैप किए गए कार्यों के अंदर पैराम पहुंच योग्य हो। ऐसा करने का एक साफ तरीका क्या होगा? और क्या इसमें कुछ नुकसान हैं ??

बहुत धन्यवाद,

मनो

+1

मैं इसके साथ सावधान रहूंगा। आप एक यूआरआई उत्पन्न कर रहे हैं जो आपके ब्राउज़र को भ्रमित कर सकता है। # तथा ? यूआरआई विनिर्देश में आरक्षित माना जाता है और? # से पहले की उम्मीद है। यह कोई समस्या नहीं हो सकती है, लेकिन ऐसा लगता है कि यह विभिन्न ब्राउज़रों में अनपेक्षित परिणाम हो सकता है। http://labs.apache.org/webarch/uri/rfc/rfc3986.html –

+0

@BrianGenisio जानकारी के लिए धन्यवाद। यह अब काम करता है लेकिन जैसा कि आप कहते हैं कि यह बाद की तारीख पर काम करना बंद कर सकता है जब ब्राउज़र std :-) के साथ अनुपालन शुरू करते हैं, वैकल्पिक दृष्टिकोण का प्रयास करेंगे। –

+0

क्यों न केवल स्लैश का उपयोग करें? –

उत्तर

10

आप Backbone.Router में _extractParameters समारोह को फिर से परिभाषित करना चाहिए। तब सभी रूटर कार्यों पहले पैरामीटर जा रहा है params वस्तु के साथ सक्रिय किया जाएगा।

// Backbone Router with a custom parameter extractor 
var Router = Backbone.Router.extend({ 
    routes: { 
     'dashboard/:country/:city/?:params': 'whereAmIActually', 
     'dashboard/?:params': 'whereAmI' 
    }, 
    whereAmIActually: function(params, country, city){ 
     console.log('whereAmIActually'); 
     console.log(arguments); 
    }, 
    whereAmI: function(params){ 
     console.log('whereAmI'); 
     console.log(arguments); 
    }, 
    _extractParameters: function(route, fragment) { 
     var result = route.exec(fragment).slice(1); 
     result.unshift(deparam(result[result.length-1])); 
     return result.slice(0,-1); 
    } 
}); 

// simplified $.deparam analog 
var deparam = function(paramString){ 
    var result = {}; 
    if(! paramString){ 
     return result; 
    } 
    $.each(paramString.split('&'), function(index, value){ 
     if(value){ 
      var param = value.split('='); 
      result[param[0]] = param[1]; 
     } 
    }); 
    return result; 
}; 

var router = new Router; 
Backbone.history.start(); 

// this call assumes that the url has been changed 
Backbone.history.loadUrl('dashboard/?planet=earth&system=solar'); 
Backbone.history.loadUrl('dashboard/usa/la/?planet=earth&system=solar'); 

काम कर डेमो here है।