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)
如果您要做很多这样的事情,您可能会看一下这个模式,以便将它们整齐地包装起来。不过,对于这些,以下正则表达式应该可以做到这一点:
/\/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)
归档时间: |
|
查看次数: |
13194 次 |
最近记录: |