如何使用AngularJS重新加载或重新呈现整个页面

and*_*vom 296 javascript reload node.js rerender angularjs

在基于多个用户上下文呈现整个页面并发出多个$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);
};
Run Code Online (Sandbox Code Playgroud)

如果我使用$window.location.reload(),那么一些$http请求auth.impersonate(username)等待响应被取消,所以我不能使用它.此外,黑客$location.path($location.path())也不起作用(没有任何反应).

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

and*_*vom 399

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

$route.reload();
Run Code Online (Sandbox Code Playgroud)

根据AngularJS 文档:

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

因此,ngView创建新范围,重新实例化控制器.

  • 记得向控制器注入`$ route`以使其正常工作. (10认同)
  • 感谢评论,出于某种原因,当我使用`$ route.reload()`与普通刷新相比时,我的行为似乎略有不同.例如,选项卡设置为最初在刷新时显示,但是当重新加载方法似乎重新加载页面而不设置选项卡时,不确定问题是什么. (6认同)
  • @alphapilgrim ngRoute模块不再是核心`angular.js文件`的一部分.如果你继续使用`$ routeProvider`,那么你现在需要在HTML中包含`angular-route.js`: (6认同)
  • $ state.reload()如果你使用stateProvider (3认同)
  • 这会运行过滤器/服务吗?获得不受欢迎的持久状态.编辑:仍然赞成正确回答问题,这是非常有帮助的.谢谢 (2认同)

dan*_*nza 313

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

$window.location.reload();
Run Code Online (Sandbox Code Playgroud)

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

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

Angular 2

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

  • 谁说的?应该在哪里存储缓存数据? (19认同)
  • 由于数据存储在服务中,我偶然发现了许多错误,使它们成为有状态而不是无状态.除非我们讨论缓存服务(在这种情况下,会有一个用于刷新它的接口),否则我会将数据保存在服务和控制器之外.例如,可以将数据保存在localStorage中,并使用服务来访问它.这将使服务免于将数据直接保存在其中. (5认同)
  • 值得注意的是,无论如何都不应该在服务中存储状态以要求"重新启动"服务. (2认同)
  • @danza*应该在哪里存储缓存数据?*...模型对象?Howver Angular在命名他们的MVCS成员方面做得非常糟糕.我通过module.value API保留可注入的模型对象.然后我在ng服务上定义的各种API改变模型对象的工作更像命令. (2认同)
  • 当然,这会奏效,但这不是好的做法.请参阅[有关$ window的文档](https://docs.angularjs.org/api/ng/service/$window),开头解释了使用它的原因:*虽然JavaScript在全局可用,但它导致可测性问题,因为它是一个全局变量.在角度我们总是通过$ window服务引用它,所以它可能被覆盖,删除或模拟测试* (2认同)

Kum*_*hav 38

用于重新加载给定路径路径的页面: -

$location.path('/path1/path2');
$route.reload();
Run Code Online (Sandbox Code Playgroud)

  • 不知道为什么,但.reload()方法似乎不起作用.它没有任何意义. (6认同)

小智 28

如果您使用角度ui-router,这将是最佳解决方案.

$scope.myLoadingFunction = function() {
    $state.reload();
};
Run Code Online (Sandbox Code Playgroud)


小智 24

好吧,也许您在声明Controller的依赖关系时忘记添加"$ route":

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


Vai*_*ibs 9

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

查看工作示例

HTML

<div ng-controller="MyCtrl">  
<button  ng-click="reloadPage();">Reset</button>
</div>
Run Code Online (Sandbox Code Playgroud)

angularJS

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

function MyCtrl($scope) {
    $scope.reloadPage = function(){window.location.reload();}
}
Run Code Online (Sandbox Code Playgroud)

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


Yam*_*raf 7

尝试以下方法之一:

$route.reload(); // don't forget to inject $route in your controller
$window.location.reload();
location.reload();
Run Code Online (Sandbox Code Playgroud)


小智 6

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

  • 注入$ 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});
}
Run Code Online (Sandbox Code Playgroud)

这将刷新控制器和HTML,您可以将其称为刷新或重新渲染.

  • 这是ui路由器不适合角度. (2认同)

Thi*_*ath 6

Angular 2之前(AngularJs)

通过路线

$route.reload();
Run Code Online (Sandbox Code Playgroud)

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

$window.location.reload();
Run Code Online (Sandbox Code Playgroud)

角2+

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

constructor(private location: Location) {}

ngOnInit() {  }

load() {
    this.location.reload()
}
Run Code Online (Sandbox Code Playgroud)

要么

constructor(private location: Location) {}

ngOnInit() {  }

Methods (){
    this.ngOnInit();
}
Run Code Online (Sandbox Code Playgroud)


diy*_*da_ 5

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

每次回来时都要添加'/'到想要重新加载的路由.

例如:

而不是以下

$routeProvider
  .when('/About', {
    templateUrl: 'about.html',
    controller: 'AboutCtrl'
  })
Run Code Online (Sandbox Code Playgroud)

使用,

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

  • @PardeepJain这对我有用.这就是为什么这是一个答案.你拒绝了我的回答吗? (2认同)
  • 完美解决方案 THKS! (2认同)