我的Backbone路由器中有以下路由:
'surveys/:surveyId?:opts': 'SurveyList:Selected'
以下处理程序捕获任何路由并在消息总线上重新发布它以供我的视图处理:
this.on('route', function() {
PubSub.publish(Events.RouteChanged, {
route: arguments[0],
options: arguments[1]
});
});
当路由器匹配路由surveys/myTestId123?pageNum=2
时,预期的行为是arguments[1]
将是包含2个参数的数组:myTestId123
和pageNum=2
。但是,它实际上是一个包含3个参数的数组 - 前面提到的两个参数和第三个null
值。我将其缩小到_extractParameters
方法,该方法将url片段与正则表达式匹配。在这种情况下,正则表达式为/^surveys\/([^\/?]+)(?:\?([^\/?]+))?(?:\?([\s\S]*))?$/i
。
有趣的是,当路由为surveys/:surveyId
时,我会得到正确的参数,这反过来会生成此正则表达式:/^surveys\/([^\/?]+)(?:\?([\s\S]*))?$/i
。
Here is a fiddle showing the problem in action
这是Backbone从我的路线创建的正则表达式的问题,还是路由本身的问题?
答案 0 :(得分:0)
我想我刚刚发现了答案。看起来Backbone已经完成了我想要做的事情。如果我有路由surveys
,它还会提供null
参数。但是,它创建的正则表达式如下:
/^surveys(?:\?([\s\S]*))?$/i
这似乎已经匹配查询字符串参数,这解释了为什么较短的路由在我上面的示例中有效。 Backbone的那些聪明人比我领先一步。
<强>更新强>
从Backbone v1.1.1更改日志:
Backbone路由器现在处理路由片段中的查询参数,传递 他们作为最后一个参数进入处理程序。路由指定为 字符串不应该包含查询字符串(&#39; foo?:query&#39;应该 是&#39; foo&#39;)。