是否可以在Backbone.js路由中使用可选参数?
例如:
routes:
"search/[:query]": "searchIndex"
而不是:
routes:
"search/": "searchIndex"
"search/:query": "searchIndex"
答案 0 :(得分:89)
从Backbone 0.9.9开始,您可以添加带括号的可选参数。
例如,在您的路线对象中,您可以定义一个可选的路线部分,如下所示:
routes: {
"organize(/:action)": "displayOrganize"
}
现在,网址路径将匹配/#organize
和/#organize/create
等路由。
请记住,如果您需要识别/#organize/
(带有斜杠)等路线,您可以执行以下操作:
routes: {
"organize(/)(:action)": "displayOrganize"
}
答案 1 :(得分:16)
可能最简单的方法是宣布多条路线,一条带额外的arg,一条没有:
routes:{
"authProxy/:hash": "authProxy",
"authProxy/:hash/:url": "authProxy"
}
然后只需在您的方法中检查它们:
authProxy: function(hash, url){
if (url){
// Hash and URL.
}else{
// Just hash.
}
}
请注意,我比其他两个答案更喜欢这个,因为其他开发人员很容易理解正在发生的事情。
答案 2 :(得分:8)
您可以使用the route
method手动添加基于正则表达式的路由:
路线
router.route(route, name, [callback])
手动为路由器创建路由,
route
参数可以是路由字符串或正则表达式。路由或正则表达式中的每个匹配捕获都将作为参数传递给回调。
所以这样的事情应该有效:
this.route(/^search\/(.*)?/, 'searchIndex');
然后,searchIndex
会被您的任何内容或:query
作为其参数调用。
缺点是您无法将正则表达式路由放入routes
对象中。如果您希望将这些路线全部放在一起,可以在路由器route
方法中添加initialize
所有路线。
答案 3 :(得分:3)
使用*splat
:
路线
router.routes
路由哈希将带有参数的URL映射到路由器上的函数,类似于View的事件哈希。路由可以包含参数部分
:param
,它们匹配斜杠之间的单个URL组件;和splat部分*splat
,可以匹配任意数量的URL组件。例如,
"search/:query/p:page"
的路由将匹配#search/obama/p2
的片段,并将"obama"
和"2"
传递给该操作。"file/*path"
的路线将与#file/nested/folder/file.txt
匹配,并将"nested/folder/file.txt"
传递给操作。