Backbone.js路由器匹配可选参数
Backbone.js Router Matching Optional Parameters
我正在尝试创建一个可以匹配可选参数的主干路由器。
考虑以下代码:
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];
相关文章:
- 要求未定义JS回调参数
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 从node.js向CasperJS传递参数数组
- angular.js:13424错误:[ng:areq]参数'fn'不是函数,getObject
- JS和three.JS,在浏览器中进行参数测试
- 如何将一个*参数*从JS传递到AS3
- 参数列表Three.js之后的未捕获语法错误:缺少)
- 建议将包含不同参数的内联JS转换为外部脚本
- 如何在mysql查询(NODE.js)中重复使用一个参数
- 在JS参数中放置引号
- 如何将Gruntfile.js中的参数传递到webdriverio规范
- 如何将.json文件作为参数导入.js文件并使用命令行启动它
- Moment.js不接受变量作为参数
- 是否可以使用Sinon.JS检查函数参数绑定是否正确
- Meteor.js只更新一个参数,而不是整个集合
- 使用应用程序状态js和视图在angular js url上传递两个参数
- 保存上一页参数 js, jsp.
- 将重复出现的代码“外包”到带有参数(js)的函数中
- 如何在我的节点中包含另一个参数.js Web 服务
- 如何获取函数参数'js中的文本值