You should redefine _extractParameters
function in Backbone.Router
. Then all router functions will be invoked with the first parameter being params
object.
// 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');
The working demo is here.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…