308

在基于多个用户上下文渲染整个页面并发出多个$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())也不起作用(没有任何反应)。

是否有另一种方法来重新呈现页面而无需再次手动发出所有请求?

4

13 回答 13

408

作为记录,要强制角度重新渲染当前页面,您可以使用:

$route.reload();

根据 AngularJS文档

即使 $location 没有更改,也会导致 $route 服务重新加载当前路由。

结果,ngView 创建了新的范围,重新实例化了控制器。

于 2013-05-29T18:54:05.070 回答
318

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

$window.location.reload();

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

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

角 2

以上适用于 Angular 1。我没有使用 Angular 2,看起来那里的服务不同,有Router,LocationDOCUMENT. 我没有在那里测试不同的行为

于 2014-10-22T09:52:34.487 回答
39

为给定的路由路径重新加载页面:-

$location.path('/path1/path2');
$route.reload();
于 2014-06-30T09:37:52.150 回答
29

如果您使用的是angular ui-router,这将是最好的解决方案。

$scope.myLoadingFunction = function() {
    $state.reload();
};
于 2016-07-28T05:01:10.873 回答
24

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

app.controller('NameCtrl', ['$scope','$route', function($scope,$route) {   
   // $route.reload(); Then this should work fine.
}]);
于 2014-08-22T16:11:28.720 回答
9

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

查看工作示例

HTML

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

角JS

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

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

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

于 2016-01-17T18:11:22.623 回答
7

尝试以下方法之一:

$route.reload(); // don't forget to inject $route in your controller
$window.location.reload();
location.reload();
于 2018-10-31T13:31:29.363 回答
7

如果你想在刷新你正在使用的任何服务的同时刷新控制器,你可以使用这个解决方案:

  • 注入 $state

IE

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

于 2016-06-15T20:54:17.330 回答
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();
}
于 2018-07-23T08:38:49.277 回答
5

我认为最简单的解决方案是,

在每次返回时要重新加载的路由中添加“/”。

例如:

而不是以下

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

利用,

$routeProvider
  .when('/About/', { //notice the '/' at the end 
    templateUrl: 'about.html',
    controller: 'AboutCtrl'
  })
于 2016-02-01T20:04:33.190 回答
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 });
        };
于 2017-05-18T12:49:11.220 回答
3

使用以下代码,无需向用户发出贴心的重新加载通知。它将呈现页面

var currentPageTemplate = $route.current.templateUrl;
$templateCache.remove(currentPageTemplate);
$window.location.reload();
于 2016-05-04T11:38:16.783 回答
-9

几个月来我一直在努力解决这个问题,唯一对我有用的解决方案是:

var landingUrl = "http://www.ytopic.es"; //URL complete
$window.location.href = landingUrl;
于 2015-01-14T12:53:37.563 回答