如何使用AngularJS重新加载或重新渲染整个页面


299

在基于几个用户上下文渲染了整个页面并提出了几个$http请求之后,我希望用户能够切换上下文并再次重新渲染所有内容(重新发送所有$http请求等)。如果我只是将用户重定向到其他地方,则一切正常:

$scope.on_impersonate_success = function(response) {
  //$window.location.reload(); // This cancels any current request
  $location.path('/'); // This works as expected, if path != current_path
};

$scope.impersonate = function(username) {
  return auth.impersonate(username)
    .then($scope.on_impersonate_success, $scope.on_auth_failed);
};

如果使用$window.location.reload(),则正在等待响应的$http请求中的某些请求auth.impersonate(username)将被取消,因此无法使用它。此外,骇客$location.path($location.path())也无法运作(一无所获)。

还有另一种方法可以重新渲染页面,而无需再次手动发出所有请求吗?


就像Alvaro Joao在下面说的那样,您需要使用angular-route.js才能使其正常工作。 bennadel.com/blog/...
伊冯Aburrow

Answers:


404

为了进行记录,要强制angular重新呈现当前页面,可以使用:

$route.reload();

根据AngularJS 文档

即使$ location保持不变,也使$ route服务重新加载当前路由。

结果,ngView创建了新的作用域,重新实例化了控制器。


6
感谢您的评论,由于某种原因,$route.reload()与普通刷新相比,使用时似乎会出现些微不同的行为。例如,一个选项卡被设置为在刷新时最初显示,但是当reload方法似乎在不设置该选项卡的情况下重新加载页面时,不确定是什么问题。
Doug Molineux 2014年

2
这还会运行过滤器/服务吗?获取不希望的持久状态。编辑:仍然对正确回答问题表示赞赏,这超级有帮助。谢谢
2014年

10
记住要注入$route控制器以使其正常工作。
Neel 2015年

6
@alphapilgrim ngRoute模块不再是核心的一部分angular.js file。如果您继续使用,$routeProvider则现在需要angular-route.js在HTML中添加:
Alvaro Joao

3
$ state.reload()(如果您使用stateProvider)
Lalit Rao

314

$route.reload()将重新初始化控制器,而不是服务。如果要重置应用程序的整体状态,可以使用:

$window.location.reload();

这是一个标准的DOM方法,您可以访问注入$ window服务。

如果要确保从服务器重新加载页面(例如,当您使用Django或其他Web框架时),并且想要新的服务器端渲染,请true按照docs中的reload说明作为参数传递给。由于这需要与服务器交互,因此它会变慢,因此仅在必要时才这样做

角度2

上述适用于角1.我不使用角2,貌似服务不同有,有RouterLocationDOCUMENT。我没有在那里测试不同的行为


2
值得注意的是,无论如何都不应将状态存储在服务中以要求“重启”服务。
andersonvom 2014年

19
谁说的?应该在哪里存储缓存的数据?
丹扎2014年

5
由于数据存储在服务中,我发现了许多错误,使它们变为有状态而不是无状态。除非我们谈论的是缓存服务(在这种情况下,将有一个刷新它的接口),否则我将数据保留在服务之外和控制器中。例如,可以将数据保存在localStorage中,然后使用一种服务来访问它。这将使服务免于直接将数据保留在其中。
andersonvom 2014年

2
@danza 应该在哪里存储缓存的数据?...模型对象?然而,Angular在命名其MVCS成分方面做得很糟糕。我通过module.value API保留可注入模型对象。然后,我在ng服务上定义的更改模型对象的各种API就像命令一样工作。
jusopi 2014年

2
当然可以,但这不是一个好习惯。请参阅有关$ window的文档,其中使用它的原因已在开头进行了解释:虽然window在JavaScript中是全局可用的,但由于它是全局变量,因此会导致可测试性问题。在角度上,我们总是通过$ window服务来引用它,因此它可能会被覆盖,删除或嘲笑以进行测试
danza


28

如果您使用的是角度ui路由器,这将是最佳解决方案。

$scope.myLoadingFunction = function() {
    $state.reload();
};

在我的cli项目中,部署到共享主机后。当我重新加载我的项目时,使用404错误来解决此问题。如果我添加了'use hash',那么它可以与'#'一起使用,但是我不希望这样,可以解决它。
T. Shashwat,

24

好吧,也许您在声明Controller的依赖项时忘记添加“ $ route”:

app.controller('NameCtrl', ['$scope','$route', function($scope,$route) {   
   // $route.reload(); Then this should work fine.
}]);

9

只是要重新加载所有内容,请使用window.location.reload();。与angularjs

查看工作示例

的HTML

<div ng-controller="MyCtrl">  
<button  ng-click="reloadPage();">Reset</button>
</div>

angularJS

var myApp = angular.module('myApp',[]);

function MyCtrl($scope) {
    $scope.reloadPage = function(){window.location.reload();}
}

http://jsfiddle.net/HB7LU/22324/


7

如果要在刷新正在使用的任何服务时刷新控制器,则可以使用以下解决方案:

  • 注入$ state

app.controller('myCtrl',['$scope','MyService','$state', function($scope,MyService,$state) {

    //At the point where you want to refresh the controller including MyServices

    $state.reload();

    //OR:

    $state.go($state.current, {}, {reload: true});
}

这将刷新控制器和HTML,您也可以将其称为Refresh或Re-Render


2
这是针对ui路由器而不是针对角度的。
dgzornoza

6

Angular 2之前(AngularJs)

通过路线

$route.reload();

如果您想重新加载整个应用程序

$window.location.reload();

角2+

import { Location } from '@angular/common';

constructor(private location: Location) {}

ngOnInit() {  }

load() {
    this.location.reload()
}

要么

constructor(private location: Location) {}

ngOnInit() {  }

Methods (){
    this.ngOnInit();
}

仅供参考-Angular 7:“类型'Location'上不存在属性'reload'”。
ACEG

@Cristina感谢您的信息。我前角7使用
Thilina萨姆帕斯

5

我想到的最简单的解决方案是

将“ /”添加到每次回来时要重新加载的路由。

例如:

代替以下

$routeProvider
  .when('/About', {
    templateUrl: 'about.html',
    controller: 'AboutCtrl'
  })

采用,

$routeProvider
  .when('/About/', { //notice the '/' at the end 
    templateUrl: 'about.html',
    controller: 'AboutCtrl'
  })

2
@PardeepJain这对我有用。这就是为什么这是答案。你否决了我的答案吗?
diyoda_

1
不,一点也不,你的回答不是很糟糕。令人惊讶的是我现在不知道为什么在angular2中同样无法使用。
Pardeep Jain

2
完美的解决方案。ks!
simon

即使您的原始路径是应用程序的根目录,此方法也有效- /:O我的路线现在看起来像这样://
MadPhysicist 2016年

在Angular 6中,它在使用#之后也可以用于Angular2。这么认为
T. Shashwat,

5

请尝试以下方法之一:

$route.reload(); // don't forget to inject $route in your controller
$window.location.reload();
location.reload();

4

我得到了此工作代码,用于删除缓存并重新加载页面

视图

        <a class="btn" ng-click="reload()">
            <i class="icon-reload"></i> 
        </a>

控制者

注入器:$ scope,$ state,$ stateParams,$ templateCache

       $scope.reload = function() { // To Reload anypage
            $templateCache.removeAll();     
            $state.transitionTo($state.current, $stateParams, { reload: true, inherit: true, notify: true });
        };

3

使用以下代码,而无需向用户发送密切的重新加载通知。它将呈现页面

var currentPageTemplate = $route.current.templateUrl;
$templateCache.remove(currentPageTemplate);
$window.location.reload();

-8

我已经为这个问题进行了数月的艰苦奋斗,而对我来说唯一有效的解决方案是:

var landingUrl = "http://www.ytopic.es"; //URL complete
$window.location.href = landingUrl;

4
$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.