如何让AngularJS ui-router识别包含句点的url查询参数名称?

时间:2015-11-25 16:09:13

标签: angularjs angular-ui-router

使用ui-router v0.2.15。在我们的AngularJS(v1.4.7)应用程序设置中有一条路线如下:

.state('routeState',
{
    url: '/path/segment?param.sub.a&param.sub.b&param.sub.c',
    ...
}

据我了解协议,在url查询参数名称中包含句点是有效的。即;

?first.name=Bobo&last.name=Muffy

当我在Angular中设置此路由时,出现错误,因为正则表达式似乎将名称部分剥离(或拆分)为段。因此它基本上将'param.sub.a'视为'param',然后错误地说'param.sub.b'是'param.sub.a'的副本(因为它只读'param') 'param.sub.b')的一部分。

不幸的是,我们无法更改参数名称,因为它们是现有协议的一部分。我不确定是否有解决我的问题的解决方法,不涉及更改ui-router模块本身。

在搜索之后,我似乎无法找到任何其他人遇到此问题。虽然我确实发现thisthis问题,但它们似乎与参数值包含句点而非参数名称有关。

其他人遇到(并希望解决)这个问题?希望我只是遗漏了框架中已经存在的一些可以解决这个问题的东西。

更新

(更新11/30以优化修改的正则表达式)

在对正则表达式进行自我教育,然后跟踪ui-router的执行路径之后,我想我已经缩小了代码中出现的位置,以及可能的修复。

在angular-ui-router.js(v0.2.15)中,在文件urlMatcherFactory.js中,变量searchPlaceholder的定义如下:

searchPlaceholder = /([:]?)([\w\[\]-]+)|\{([\w\[\]-]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g

下限是以下代码段处理任何搜索参数的地方:

if (search.length > 0) {
    last = 0;
    while ((m = searchPlaceholder.exec(search))) {
      p = matchDetails(m, true);
      param = addParameter(p.id, p.type, p.cfg, "search");
      last = placeholder.lastIndex;
      // check if ?&
    }
}

如果我用\w\[\]-替换正则表达式中的\w\[\].-段,则会显示这些句点现在作为名称的一部分包含在内。在研究了哪些字符实际上被认为对herehere的URI查询参数有效之后,尝试了这一点。

我也有post up on ui-router's GitHub page

再一次,可能还有另一种方法可以让这只猫仍然被认为是在我看不到的框架内 - 所以如果有人对ui-router有更深入的了解,可以解决这个问题,而无需更新正则表达式,我会非常感激。

0 个答案:

没有答案