AngularJS-如何在整个页面加载时进行重定向?


94

我想进行重定向,以重新加载整个页面,以便在页面加载时刷新来自我的Web服务器的cookie。window.location = "/#/Next"而且window.location.href = "/#/Next"不起作用,它们会执行不打服务器的Angular路由。

在Angular控制器中发出完整服务器请求的正确方法是什么?


8
你有解决过这个吗?
superjos

7
你有解决过这个吗?
Nolwennig

6
你解决了这个吗?
Dan Beaulieu

5
你有解决过这个吗?
我的筹码满溢

4
你解决了这个吗?
shahzain ali

Answers:


183

对于<a>标签

你要坚持target="_self"你的<a>标签

在三种情况下,AngularJS将执行整页重新加载:

  • 包含目标元素的链接
    示例:<a href="https://stackoverflow.com/ext/link?a=b" target="_self">link</a>
  • 转到其他域的绝对链接
    示例:<a href="http://angularjs.org/">link</a>
  • 以'/'开头的链接在定义base时导致不同的基本路径
    示例:<a href="https://stackoverflow.com/not-my-base/link">link</a>

使用javascript

$location服务仅允许您更改URL。它不允许您重新加载页面。当您需要更改URL并重新加载页面或导航到其他页面时,请使用较低级别的API :$window.location.href

看到:


15
$ window.location.href与window.location.href具有相同的作用。我很确定$ window只是窗口的包装服务。两种方法都执行Angular路由而不是刷新整个页面。
Mike Pateras

3
$ window.location.href肯定会引起整页刷新,我正在我的应用程序中执行此操作。
jszobody

3
我读过同样的东西。在当前版本的Chrome中不起作用。它会执行Angular路线。
Mike Pateras

1
来自CDN的1.0.6。如果重要的话,我正在$ http.post成功回调中执行此操作,尽管我已经在回调之外进行了尝试并获得了相同的结果。如果我重定向到“ /”(我也定义了Angular路由),它将与整页刷新一起工作,但是“ /#/ Next”只是会改变视图。
Mike Pateras

5
<a href="..." target="_self">对我有用。谢谢 !
迈克尔

33

我们有同样的问题,使用JS代码(即不是使用HTML锚)。这是我们解决的方法:

  1. 如果需要,通过服务虚拟更改当前URL $location。如果您的目标只是当前URL的变体,那么这可能很有用,以便您可以利用$location帮助器方法。例如,我们$location.search(..., ...)只是更改查询字符串参数的值。

  2. 建立新的目标网址,并$location.url()在需要时使用当前网址。为了工作,这一新功能必须包括架构,域和端口之后的所有内容。因此,例如,如果您想转到:

    http://yourdomain.com/YourAppFolder/YourAngularApp/#/YourArea/YourAction?culture=en

    那么您应该将URL设置为:

    var destinationUrl = '/YourAppFolder/YourAngularApp/#/YourArea/YourAction?culture=en';

    (以及领导者'/')。

  3. 底层分配新的目标网址:$window.location.href = destinationUrl;

  4. 强制重新加载,但仍处于较低级别: $window.location.reload();


1
在使用Chrome 38的Angular 1.3.1中,这对我不起作用。当我分配路径或完整URL时,$ window.location.href的值不会更改。只有$ window.location.assign()对我有用。
FelixM 2014年

有同样的问题费利克斯,解决它以不同的方式stackoverflow.com/questions/31137809/...
索罗什Hakami

13

搜索并提供匹配和试用期后,我可以先指定网址,例如

$window.location.href = '/#/home/stats';

然后重新加载

$window.location.reload();

这似乎可以解决问题,但是在浏览器上前后单击会导致很多不一致之处。
luisluix

9

我遇到过同样的问题。当我使用时window.location$window.location甚至<a href="..." target="_self">路由也不会刷新页面。因此,使用了缓存的服务,这不是我想要的应用程序中的服务。我通过添加window.location.reload()after window.location来解决此问题,以强制页面在路由后重新加载。但是,此方法似乎将页面加载两次。可能是一个肮脏的把戏,但它确实起作用。我现在是这样的:

  $scope.openPage = function (pageName) {
      window.location = '#/html/pages/' + pageName;
      window.location.reload();
  };

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.