Backbone.js路由器匹配可选参数

7 javascript regex routes backbone.js

我正在尝试创建一个可以匹配可选参数的骨干路由器.

请考虑以下代码:

routes: {  
  '/jobs'                                     : 'jobs',
  '/jobs/p:page'                              : 'jobs',
  '/jobs/job/:job_id'                         : 'jobs',
  '/jobs/p:page/job/:job_id'                  : 'jobs'
}

jobs: function(page, job_id){
   // do stuff here ....
}
Run Code Online (Sandbox Code Playgroud)

如果我浏览到URL abc.com/ #/职位/ P104 /页面参数将是104.但是,如果导航到abc.com/#/ jobs/job/93,则job_id参数未定义,页面参数为93.

所以Backbone的路由器基本上按顺序匹配路由哈希参数而不是名称.

我知道解决方案是使用*splat并使用正则表达式拆分参数,但我似乎无法使正则表达式部分工作(我的正则表达式非常生疏).有人可以帮忙吗?

如果有比使用*splat更好的解决方案,有人可以分享吗?

abr*_*ham 21

而不是搞乱正则表达式,只是为了拥有第二个函数会更容易,更不容易出错.你可能必须在this.jobs的初始化函数中绑定所有这个才能工作.

routes: {  
  '/jobs'                                     : 'jobs',
  '/jobs/p:page'                              : 'jobs',
  '/jobs/job/:job_id'                         : 'jobsId',
  '/jobs/p:page/job/:job_id'                  : 'jobs'
},

jobs: function(page, job_id){
   // do stuff here ....
},

jobsId: function(page, job_id){
   this.jobs(undefined, job_id
}
Run Code Online (Sandbox Code Playgroud)


rjz*_*rjz 0

如果您要做很​​多这样的事情,您可能会看一下这个模式,以便将它们整齐地包装起来。不过,对于这些,以下正则表达式应该可以做到这一点:

/\/jobs\/p(\d+)/              => /jobs/pXXX
/\/jobs\/p(\d+)\/job\/(\d+)/  => /jobs/pXXX/job/XXX
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用String.match检索到的 splats 来提取有问题的 url 片段。使用字符串代替splat变量:

var matches = '/jobs/p18'.match(/\/jobs\/p(\d+)/);
var page = matches[1];

var matches = '/jobs/p4/job/6/'.match(/\/jobs\/p(\d+)\/job\/(\d+)/);
var page = matches[1];
var job = matches[2];
Run Code Online (Sandbox Code Playgroud)