Backbone.Router принимает запрос и путь
Я хочу, чтобы мой экземпляр Backbone.Router прослушивал хеш-банг, такой как "#/settings" и "#/settings/privacy"
В настоящее время я решаю эту проблему следующим образом:
var Router = Backbone.Router.extend({
routes: {
"settings": "settings",
"settings/:query": "settings"
},
settings: function(query) {
// do the routing
}
});
Теперь я хотел бы сделать все это только одним маршрутом. К сожалению, "settings/:query" разрешает только "settings /"
Любая идея, как справиться с этим?
С уважением
1 ответ
У вас есть несколько вариантов здесь. Если вы довольны такими маршрутами, как #settings/
(обратите внимание на последний слеш) и #settings/privacy
тогда вы можете использовать это:
routes: {
'settings/*query': 'settings'
}
Демо: http://jsfiddle.net/ambiguous/m7ufD/
Это не будет работать только с #settings
тем не менее, последний слеш необходим для того, чтобы этот маршрут работал.
Если у вас нет таких маршрутов, как #settings-something-else
тогда вы можете сделать это:
routes: {
'settings*query': 'settings'
}
Демо: http://jsfiddle.net/ambiguous/MudaG/
Это также будет соответствовать таким вещам, как #settingsandstuff
и это оставило бы косую черту в аргументе обработчика маршрута (то есть функция получит '/privacy'
вместо просто 'privacy'
).
Самый гибкий вариант - это использовать route
непосредственно с регулярным выражением, то вы можете сопоставить #settings
а также #settings/privacy
с одним маршрутом без любой из вышеперечисленных проблем:
// No routes, do it in initialize instead
initialize: function() {
this.route(/^settings(?:\/(.*)|)$/, 'settings');
}
Демо: http://jsfiddle.net/ambiguous/XGrQz/
Это не будет соответствовать #settings-and-stuff
и он не будет включать начальный слеш в аргумент функции для #settings/privacy
,