После рендеринга всей страницы на основе нескольких пользовательских контекстов и создания нескольких запросов $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)
, которые ждут ответа, будут отменены, поэтому я не могу использовать это. Кроме того, hack $location.path($location.path())
тоже не работает (ничего не происходит).
Есть ли другой способ повторной рендеринга страницы без повторного запроса всех запросов еще раз?
Для записи, чтобы заставить angular повторно отобразить текущую страницу, вы можете использовать:
$route.reload();
В соответствии с AngularJS документация:
Заставляет $route service перезагружать текущий маршрут, даже если $location не изменилось.
В результате этого ngView создает новую область действия, восстанавливает контроллер.
$route.reload()
по сравнению с обычным обновлением. Например, вкладка настроена на первоначальное отображение при обновлении, но, когда кажется, что метод перезагрузки перезагружает страницу без настройки вкладки, не знаете, в чем проблема.
$route.reload()
будет повторно инициализировать контроллеры, но не сервисы. Если вы хотите reset указать все состояние своего приложения, вы можете использовать:
$window.location.reload();
Это стандартный метод DOM, с помощью которого вы можете получить доступ к службе $window.
Если вы хотите, чтобы вы перезагрузили страницу с сервера, например, когда вы используете Django или другую веб-фреймворк, и хотите визуализировать новую серверную сторону, передайте true
в качестве параметра reload
, так как объясняется в документах. Поскольку для этого требуется взаимодействие с сервером, оно будет медленнее, поэтому при необходимости
Вышеупомянутое относится к Angular 1. Я не использую Angular 2, похоже, что там разные службы, есть Router
, Location
и DOCUMENT
. Я не тестировал различные варианты поведения там
Для перезагрузки страницы для заданного маршрута маршрута: -
$location.path('/path1/path2');
$route.reload();
Если вы используете angular ui-router, это будет лучшее решение.
$scope.myLoadingFunction = function() {
$state.reload();
};
Возможно, вы забыли добавить "$ route" при объявлении зависимостей вашего контроллера:
app.controller('NameCtrl', ['$scope','$route', function($scope,$route) {
// $route.reload(); Then this should work fine.
}]);
Чтобы перезагрузить все, используйте window.location.reload(); с угловыми значениями
Проверьте рабочий пример
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();}
}
Самое простое решение, которое я понял, было
добавьте '/' к маршруту, который нужно перезагружать каждый раз при возврате.
например:
вместо следующего
$routeProvider
.when('/About', {
templateUrl: 'about.html',
controller: 'AboutCtrl'
})
использование
$routeProvider
.when('/About/', { //notice the '/' at the end
templateUrl: 'about.html',
controller: 'AboutCtrl'
})
Перед 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();
}
Если вы хотите обновить контроллер при обновлении любых служб, которые вы используете, вы можете использовать это решение:
то есть.
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, а также вы можете назвать его Обновить или повторно рендерить.
Я получил этот рабочий код для удаления кеша и перезагрузки страницы
Просмотр
<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 });
};
Используйте следующий код без интимного уведомления о перезагрузке для пользователя. Он отобразит страницу
var currentPageTemplate = $route.current.templateUrl;
$templateCache.remove(currentPageTemplate);
$window.location.reload();
Попробуйте выполнить одно из следующих действий:
$route.reload(); // don't forget to inject $route in your controller
$window.location.reload();
location.reload();
У меня был тяжелый бой с этой проблемой в течение нескольких месяцев, и единственным решением, которое сработало для меня, является следующее:
var landingUrl = "http://www.ytopic.es"; //URL complete
$window.location.href = landingUrl;
$window.location.reload()
которое, в частности, упоминает OP, не работает должным образом в его случае.