在基于多个用户上下文呈现整个页面并发出多个$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())
也不起作用(没有任何反应)。
是否有另一种方法可以重新呈现页面而无需再次手动发出所有请求?
答案 0 :(得分:397)
对于记录,要强制角度重新渲染当前页面,您可以使用:
$route.reload();
根据AngularJS documentation:
即使$ location未更改,也会导致$ route服务重新加载当前路由。
因此,ngView创建新范围,重新实现控制器。
答案 1 :(得分:310)
$route.reload()
将重新初始化控制器,但不会重新初始化服务。如果要重置应用程序的整个状态,可以使用:
$window.location.reload();
这是standard DOM method您可以访问注入$window服务。
如果您想确保从服务器重新加载页面,例如当您使用Django或其他Web框架并且想要新的服务器端渲染时,请将true
作为参数传递给{{1 },如the docs中所述。由于这需要与服务器进行交互,因此速度会慢一些,只有在必要时才这样做
以上内容适用于Angular 1.我没有使用Angular 2,看起来服务有所不同,有reload
,Router
和Location
。我没有在那里测试不同的行为
答案 2 :(得分:38)
为重新加载给定路径路径的页面: -
$location.path('/path1/path2');
$route.reload();
答案 3 :(得分:28)
如果您使用 angular ui-router ,这将是最佳解决方案。
$scope.myLoadingFunction = function() {
$state.reload();
};
答案 4 :(得分:24)
好吧,也许您在声明控制器的依赖关系时忘记添加“$ route”:
app.controller('NameCtrl', ['$scope','$route', function($scope,$route) {
// $route.reload(); Then this should work fine.
}]);
答案 5 :(得分: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();}
}
答案 6 :(得分:5)
我认为最简单的解决方案是,
添加&#39; /&#39;每次回来时想要重新加载的路线。
例如:
而不是以下
$routeProvider
.when('/About', {
templateUrl: 'about.html',
controller: 'AboutCtrl'
})
使用,
$routeProvider
.when('/About/', { //notice the '/' at the end
templateUrl: 'about.html',
controller: 'AboutCtrl'
})
答案 7 :(得分:5)
如果要在刷新正在使用的任何服务时刷新控制器,可以使用此解决方案:
即
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,您可以将其称为刷新或重新渲染。
答案 8 :(得分:5)
在Angular 2(AngularJs)之前
通过路线
$route.reload();
如果您想重新加载整个应用程序
$window.location.reload();
Angular 2 +
import { Location } from '@angular/common';
constructor(private location: Location) {}
ngOnInit() { }
load() {
this.location.reload()
}
或
constructor(private location: Location) {}
ngOnInit() { }
Methods (){
this.ngOnInit();
}
答案 9 :(得分:4)
尝试以下操作之一:
public class FileWatcher
{
private FileSystemWatcher _watcherRoot;
private Timer _timer;
private readonly string _watchedPath;
public FileWatcher(string path)
{
// _watcher = new FileSystemWatcher();
_timer = new Timer();
_watchedPath = path;
InitWatcher();
}
public void InitWatcher()
{
_watcherRoot = new FileSystemWatcher();
_watcherRoot.Path = _watchedPath;
_watcherRoot.IncludeSubdirectories = true;
_watcherRoot.EnableRaisingEvents = true;
_watcherRoot.Created += new FileSystemEventHandler(OnCreated);
}
private void OnCreated(object sender, FileSystemEventArgs e)
{
if (e.ChangeType == WatcherChangeTypes.Created)
{
string fullPath = e.FullPath;
if (sender == _watcherRoot)
{
// If detect new folder, set the timer to 5 sec
_timer.Interval = 5000;
_timer.Elapsed += OnTimedEvent;
_timer.AutoReset = true;
_timer.Enabled = true;
// a directory
Console.WriteLine($"{fullPath.ToString()} created on {DateTime.Now}");
}
}
}
private void OnTimedEvent(object sender, ElapsedEventArgs e)
{
// Create a 2nd Watcher??
// Reset the timer in here??
}
答案 10 :(得分:3)
使用以下代码,而不向用户发送私密重新加载通知。它将呈现页面
var currentPageTemplate = $route.current.templateUrl;
$templateCache.remove(currentPageTemplate);
$window.location.reload();
答案 11 :(得分:3)
我得到了这个用于删除缓存和重新加载页面的工作代码
查看强>
<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 });
};
答案 12 :(得分:-7)
几个月来我一直在努力解决这个问题,唯一对我有用的解决方案是:
var landingUrl = "http://www.ytopic.es"; //URL complete
$window.location.href = landingUrl;