Angular JS IE9 Hashbang url重写

时间:2015-04-10 14:57:41

标签: javascript angularjs angular-ui-router

这里有一个奇怪的情况。

所以我有两条路线:/RouteA/也默认为此处)和/RouteB

/RouteA实际上使用客户端路由,而/RouteB则不重要。

当我尝试导航到/RouteB时,网址最初为/RouteB,这是正确的。

由于IE9不支持HTML5,因此Angular会使用hashbang将网址重写为/#/RouteB

当重写发生时,它会强制浏览器刷新(我们可以停止此行为吗?),这会立即将我发送回/(最终/RouteA

有没有办法阻止浏览器在重写网址时重新发送请求?

基本代码目前为<base href="/"/>

我尝试做类似这样的事情,让我可以登陆页面,但打破了主菜单中的锚标记,试图将我送回/RouteA

  if (window.history && window.history.pushState) {
     $locationProvider.html5Mode(true);
  }
  else {
     window.location.hash = '/';       
     $locationProvider.html5Mode(false);
  }

e.g。 /#/RouteB变为/RouteB/#/。然后点击返回/RouteA的链接,路线最终变为/RouteB/RouteA,显然会中断。

所以我尝试了类似问题的解决方案,但它产生了与上面相同的结果。 $location / switching between html5 and hashbang mode / link rewriting

有没有人有任何想法?

提前致谢!

2 个答案:

答案 0 :(得分:0)

我设法让它发挥作用。它不漂亮,但由于/RouteB中没有客户端路由发生,所以它已经足够了。

在两个不同的应用程序共享角度模块之前。相反,我创建了两个不同的模块,并依赖于以前共享的模块。

angular.module('sharedModule', ['dependancy1', ...]);

<!-- RouteA app -->
<div ng-app="sharedModule">...

<!-- RouteB app -->
<div ng-app="sharedModule">...

成为

angular.module('sharedModule', ['dependancy1', ...]);
angular.module('routeAModule', ['sharedModule']);
angular.module('routeBModule', ['sharedModule']);


<!-- RouteA app -->
<div ng-app="routeAModule">...

<!-- RouteB app -->
<div ng-app="routeBModule">...

然后在routeBModule我使用了此帖子中的修复:$location / switching between html5 and hashbang mode / link rewriting,我的问题也在上面提到过。

现在,当导航到/RouteB时,路由会被重写为/RouteB#/,而/将不会重新加载/并将我转发回另一页。

这个解决方案有两个问题。

  1. 使用尾随/RouteB#/导航到此页面可能会弄乱相关链接。例如/RouteB/#/变为/NewRoute因此,尝试链接到/RouteB/NewRoute最终会链接到href="#"
  2. 此页面上带有{{1}}的锚标记会导致页面刷新。
  3. 可能会对此做出很多改进,如果我让他们生病,请尝试记住更新此答案。

    如果有人有更好的解决方案,请随时发布。

    &lt; 3 IE9

答案 1 :(得分:-1)

您与路线的链接是什么样的?我认为你需要一个完整的路径来到你的应用程序之外的任何路由。你可能会尝试类似的东西:

<a href="RouteA">Route A</a>
<a href="/RouteB">Route B</a>