Router that will just show a new view in a region. The router can be configurate by a simple map like this `{'someRoute/:id' : SomeView}`. So when ever a configured route matchs, the corresponding view will be shown in the passed region.
define(function() { | |
function getRouterSetting(region, routerSettings) { | |
var settings = { | |
appRoutes: {}, | |
controller: {} | |
}; | |
// this function is called when a routes changed | |
function routeFunction(View, routes) { | |
//first arg is always the View taht should show in the main view | |
//args are all additional arguments aka. the route params | |
var args; | |
if (arguments.length > 1) { | |
args = Array.prototype.slice.call(arguments, 2); | |
} | |
//map the route params to the name in route so /someroute/:somevalue will become {somevalue: passedArgs} | |
//this object will be passed under the parameter key of the options | |
var params = {}; | |
var regEx = /(?::)(\w+)/g; | |
var match = regEx.exec(routes); | |
var count = 0; | |
while (match) { | |
params[match[1]] = args[count++]; | |
match = regEx.exec(routes); | |
} | |
//create a new View and pass the additional args as options | |
//and show the view in the region | |
region.show(new View({params: params})); | |
} | |
//map the {route: View} map into | |
// {appRoutes: {route: uniqueName}, controller: {uniqueName: routeFunction as a closure with the View passing in}} | |
_.each(routerSettings, function(View, route) { | |
var functionName = _.uniqueId('fn_'); | |
settings.appRoutes[route] = functionName; | |
settings.controller[functionName] = _.partial(routeFunction, View, route); | |
}); | |
return settings; | |
} | |
return function(region, routerSettings) { | |
var settings = getRouterSetting(region, routerSettings); | |
var Router = Backbone.Marionette.AppRouter.extend(settings); | |
return new Router(); | |
}; | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment