AngularJS 1.2.x:路由中URL解码的变更?

4

我希望将我的应用程序从AngularJS 1.0.8迁移到1.2.14,但在1.2版本中似乎存在一些“新”的URL解码方式。

我有以下路由:

 $routeProvider.when('/title/:simpleName/:simpleVersion', {templateUrl: 'partials/public/view/spec.html', controller: SpecificationCtrl});
 $routeProvider.when('/title/:simpleName', {redirectTo: '/title/:simpleName/latest'});

在我的指令中,我创建了如下的锚点:

link: function(scope, elem, attr) {
   elem.html('<a href="#/title/' + encodeURIComponent(encodeURIComponent(simpleName)) + '/">...</a>')
}

在这里,simpleName 可以是一些字符串,比如 x/y++_test

在 Angular 1.0.8 中,如果用户点击了这样的链接,浏览器将包含以下 URL:

.../title/x%252Fy%252B%252B_test

一切正常运行。但是使用Angular 1.2时,浏览器在一秒钟内重新包含了转义后的形式,然后浏览器中的URL发生了变化

.../title/x/y++_test

这是一个问题,因为它可能与我的路由规则和路由参数不匹配。当发生这种变化时,根据Chrome Dev Tools,在页面本身没有重新加载的情况下,控制器仅被创建一次,当完全解码的URL被显示时。

是否有一些新的更改导致了这个问题?我该如何使它像1.0.8版本一样工作?我查阅了Angular的更新日志,但没有找到任何有关URL解码的提及。

更新: 我使用Angular 1.0.8和1.2.13创建了Plunks来演示该问题(唯一的区别是链接是硬编码在HTML代码中,而不是由指令生成)。只需单击plunk中的“here”链接并观察显示的URL:


我有一个类似的问题。看起来这是Angular的一个bug,这里有一个在GitHub上的开放问题:https://github.com/angular/angular.js/issues/5645。还没有找到解决方法。 - Sasha
谢谢您提供的链接,我已经添加了我的评论。如果情况确实如此,我认为这是一个错误 :/ - ladar
1个回答

0

试试这个:

<a ng-href="#/title/{{encodeURIComponent(simpleName)}}">...</a>

并且在控制器内部(如果你还没有这样做):

$scope.encodeURIComponent = encodeURIComponent;

谢谢,但那并没有帮助。a元素是在指令的link()函数中创建的,并且已经正确地插入到HTML代码中了。问题在于,如果我点击链接,URL会短暂地包含转义形式(这是预期的),但然后它就会变成解码形式。这很有趣,因为我对它进行了两次编码,但它仍然完全被解码了... - ladar
你能发布一个 Plunkr 吗? - Wawy
从我所看到的情况来看,它似乎在匹配路由后执行了decodeURI。这是否真的会给您带来任何问题? - Wawy
很不幸,是的,请检查上面的路由规则,它包含2个参数,而这种解码导致第一个参数的一部分被视为第二个参数。 - ladar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接