关于正则表达式:Backbone route _extractParameters 捕获一个额外的空参数

 2022-02-12 

Backbone route _extractParameters capturing an extra null parameter

我的主干路由器中有以下路由:

1
'surveys/:surveyId?:opts': 'SurveyList:Selected'

以下处理程序捕获任何路由并将其重新发布到消息总线上以供我的视图处理:

1
2
3
4
5
6
this.on('route', function() {
    PubSub.publish(Events.RouteChanged, {
        route: arguments[0],
        options: arguments[1]
    });
});

当路由器匹配路由 surveys/myTestId123?pageNum=2 时,预期的行为是 arguments[1] 将是一个包含 2 个参数的数组:myTestId123pageNum=2。然而,它实际上是一个有 3 个参数的数组——前面提到的两个参数和一个 null 值作为第三个参数。我将其缩小到 _extractParameters 方法,该方法将 url 片段与正则表达式匹配。在这种情况下,正则表达式是 /^surveys\\/([^\\/?]+)(?:\\?([^\\/?]+))?(?:\\?([\\s\\S]*))?$/i.

有趣的是,当路由为 surveys/:surveyId 时,我得到了正确的参数,这反过来又产生了这个正则表达式:/^surveys\\/([^\\/?]+)(?:\\?([\\s\\S]*))?$/i.

这是一个显示实际问题的小提琴。

这是 Backbone 从我的路由创建的正则表达式的问题,还是路由本身的问题?


我想我刚刚找到了答案。看起来 Backbone 已经做了我想做的事情。如果我有路由 surveys,它还提供了一个 null 参数。但是,它创建的正则表达式如下:

1
/^surveys(?:\\?([\\s\\S]*))?$/i

这似乎已经匹配查询字符串参数,这解释了为什么较短的路线在我上面的示例中有效。 Backbone 的那些聪明人比我领先一步。

更新:

来自 Backbone v1.1.1 更改日志:

Backbone Routers now handle query params in route fragments, passing
them into the handler as the last argument. Routes specified as
strings should no longer include the query string ('foo?:query' should
be 'foo').