Backbone.js路由可选参数

TTT*_*TTT 41 javascript routes backbone.js

是否可以在Backbone.js路由中包含可选参数?

例如:

routes:
  "search/[:query]": "searchIndex"
Run Code Online (Sandbox Code Playgroud)

代替:

routes:
  "search/": "searchIndex"
  "search/:query": "searchIndex"
Run Code Online (Sandbox Code Playgroud)

Gab*_*e H 90

从Backbone 0.9.9开始,您可以添加带括号的可选参数.

例如,在您的路线对象中,您可以定义一个可选的路线部分,如下所示:

routes: {
    "organize(/:action)": "displayOrganize"
}
Run Code Online (Sandbox Code Playgroud)

现在url路径将匹配/#organize并且路由类似/#organize/create.

请记住,如果您需要/#organize/识别(带有斜杠)等路线,您可以执行以下操作:

routes: {
    "organize(/)(:action)": "displayOrganize"
}
Run Code Online (Sandbox Code Playgroud)


Mau*_*ord 16

可能最简单的方法就是声明多条路线,一条带有额外的arg,一条没有:

routes:{
        "authProxy/:hash": "authProxy",                                                                                                                                                                 
        "authProxy/:hash/:url": "authProxy"
}
Run Code Online (Sandbox Code Playgroud)

然后在你的方法中检查它们:

authProxy: function(hash, url){
    if (url){
      // Hash and URL.
    }else{
      // Just hash.
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我比其他两个答案更喜欢这个,因为其他开发人员很容易理解正在发生的事情.


mu *_*ort 8

您可以使用以下route方法手动添加基于正则表达式的路由:

路线 router.route(route, name, [callback])

手动为路由器创建路由,该route参数可以是路由字符串或正则表达式.路由或正则表达式中的每个匹配捕获都将作为参数传递给回调.

所以像这样的东西应该工作:

this.route(/^search\/(.*)?/, 'searchIndex');
Run Code Online (Sandbox Code Playgroud)

然后searchIndex会被你的任何东西或你:query的论点所调用.

缺点是您不能将正则表达式路由放入routes对象中.如果你想将它们全部保存在一起,你可以route在路由器的initialize方法中添加所有路由.