Backbone.js路由可选参数

时间:2012-03-07 11:13:21

标签: javascript backbone.js routes

是否可以在Backbone.js路由中使用可选参数?

例如:

routes:
  "search/[:query]": "searchIndex"

而不是:

routes:
  "search/": "searchIndex"
  "search/:query": "searchIndex"

4 个答案:

答案 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"传递给操作。