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

Backbone.js Router Matching Optional Parameters

本文关键字:参数 js 路由器 Backbone      更新时间:2023-09-26

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

考虑以下代码:

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 ....
}

如果我导航到URL abc.com/#/jobs/p104/页面参数将为104。但是,如果导航到abc.com/#/jobs/job/93,则job_id参数为未定义页面的参数为93

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

我知道解决方案是使用*splat并用regex分割参数,但我似乎无法让regex部分正常工作(我的regex很生疏)。有人能帮忙吗?

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

只需有第二个函数,就可以更容易、更不容易出错,而不是扰乱正则表达式。您可能需要在初始化函数中绑定所有这些,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
}

试试这个(单个正则表达式,适用于所有输入格式)

var re = /'/jobs(?:'/p('d+))?.*?(?:'/('d+)|$)/;
var matches = 'abc.com/#/jobs/p104/4'.match(re);
var page=false;var job=false;
if (matches != null) {
    var page = matches[1] || false;
    var job = matches[2] || false;
}; 
alert("page:" + page + ",job:" + job)

**如果pNNN段存在,则首先匹配它,并使用一个点为.的非贪婪量词(它可以吃掉任何.*?)逐个向上爬取字符串,这样第二组(仅/NNN)也将匹配(如果存在)。(?: exp )是非捕获组,它们分组,但它们什么都不"记得"。

如果你要做很多这样的事情,你可以看看这个模式,把它们包装得很整齐。不过,对于这些,应该使用以下regexs:

/'/jobs'/p('d+)/              => /jobs/pXXX
/'/jobs'/p('d+)'/job'/('d+)/  => /jobs/pXXX/job/XXX

然后,您可以将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];