Как перезагрузить или перерисовать всю страницу, используя AngularJS

298

После рендеринга всей страницы на основе нескольких пользовательских контекстов и создания нескольких запросов $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()) тоже не работает (ничего не происходит).

Есть ли другой способ повторной рендеринга страницы без повторного запроса всех запросов еще раз?

  • 0
    Как Альваро Жуан говорит ниже, вам нужно использовать angular-route.js, чтобы заставить это работать. bennadel.com/blog/...
  • 0
    Возможный дубликат AngularJs: Перезагрузить страницу
Теги:
reload

13 ответов

372
Лучший ответ

Для записи, чтобы заставить angular повторно отобразить текущую страницу, вы можете использовать:

$route.reload();

В соответствии с AngularJS документация:

Заставляет $route service перезагружать текущий маршрут, даже если $location не изменилось.

В результате этого ngView создает новую область действия, восстанавливает контроллер.

  • 6
    Спасибо за комментарий, по некоторым причинам у меня, кажется, немного другое поведение при использовании $route.reload() по сравнению с обычным обновлением. Например, вкладка настроена на первоначальное отображение при обновлении, но, когда кажется, что метод перезагрузки перезагружает страницу без настройки вкладки, не знаете, в чем проблема.
  • 1
    Можно ли перезагрузить конкретный контроллер, который не находится на фактическом представлении или состоянии?
Показать ещё 8 комментариев
290

$route.reload() будет повторно инициализировать контроллеры, но не сервисы. Если вы хотите reset указать все состояние своего приложения, вы можете использовать:

$window.location.reload();

Это стандартный метод DOM, с помощью которого вы можете получить доступ к службе $window.

Если вы хотите, чтобы вы перезагрузили страницу с сервера, например, когда вы используете Django или другую веб-фреймворк, и хотите визуализировать новую серверную сторону, передайте true в качестве параметра reload, так как объясняется в документах. Поскольку для этого требуется взаимодействие с сервером, оно будет медленнее, поэтому при необходимости

Angular 2

Вышеупомянутое относится к Angular 1. Я не использую Angular 2, похоже, что там разные службы, есть Router, Location и DOCUMENT. Я не тестировал различные варианты поведения там

  • 2
    Стоит отметить, что в любом случае не следует хранить состояние в службах, чтобы требовать «перезапуска» служб.
  • 19
    Кто так говорит? Где можно хранить кэшированные данные?
Показать ещё 14 комментариев
36

Для перезагрузки страницы для заданного маршрута маршрута: -

$location.path('/path1/path2');
$route.reload();
  • 6
    Не знаю почему, но метод .reload () здесь не работает. Это ничего не понимает.
28

Если вы используете angular ui-router, это будет лучшее решение.

$scope.myLoadingFunction = function() {
    $state.reload();
};
  • 0
    В моем кли-проекте после размещения на виртуальном хостинге. Когда я перезагружаю свой проект, он дает ошибку 404 для решения этой проблемы. Если я добавлю «использовать хэш», то он будет работать с «#», но я не хочу этого, есть ли способ, который может быть решен.
23

Возможно, вы забыли добавить "$ route" при объявлении зависимостей вашего контроллера:

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

Чтобы перезагрузить все, используйте 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();}
}

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

5

Самое простое решение, которое я понял, было

добавьте '/' к маршруту, который нужно перезагружать каждый раз при возврате.

например:

вместо следующего

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

использование

$routeProvider
  .when('/About/', { //notice the '/' at the end 
    templateUrl: 'about.html',
    controller: 'AboutCtrl'
  })
  • 1
    что это значит ? не работает для angular2?
  • 2
    @PardeepJain Это сработало для меня. Вот почему это ответ. Вы понизили мой ответ?
Показать ещё 4 комментария
4

Перед 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();
}
  • 0
    К вашему сведению - Угловой 7: «Свойство reload не существует для типа« Местоположение »».
  • 0
    @Cristina благодарит вашу информацию. Я использую это до угловой 7
4

Если вы хотите обновить контроллер при обновлении любых служб, которые вы используете, вы можете использовать это решение:

  • Ввести $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, а также вы можете назвать его Обновить или повторно рендерить.

  • 2
    это для пользовательского интерфейса маршрутизатора, а не для угловых.
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 });
        };
3

Используйте следующий код без интимного уведомления о перезагрузке для пользователя. Он отобразит страницу

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

Попробуйте выполнить одно из следующих действий:

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

У меня был тяжелый бой с этой проблемой в течение нескольких месяцев, и единственным решением, которое сработало для меня, является следующее:

var landingUrl = "http://www.ytopic.es"; //URL complete
$window.location.href = landingUrl;
  • 4
    Это мало чем отличается от выполнения $window.location.reload() которое, в частности, упоминает OP, не работает должным образом в его случае.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню