Як перезавантажити або відновити всю сторінку за допомогою AngularJS


299

Після рендерингу всієї сторінки на основі декількох контекстів користувачів і зробивши кілька $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())не працює (нічого не відбувається).

Чи є інший спосіб відновити сторінку, не вручну знову надсилаючи всі запити?


Як говорить Альваро Жоао нижче, вам потрібно використовувати angular-route.js для того, щоб це спрацювало. bennadel.com/blog/…
Івон Абруроу

Відповіді:


404

Для запису, щоб змусити кут повторно відредагувати поточну сторінку, ви можете використовувати:

$route.reload();

Відповідно до документації AngularJS :

Викликає службу $ route для перезавантаження поточного маршруту, навіть якщо $ location не змінилося.

У результаті цього, ngView створює новий діапазон, відновляє контролер.


6
Дякую за коментар, я чомусь маю дещо іншу поведінку, коли використовую $route.reload()порівняно зі звичайним оновленням. Наприклад, на вкладці встановлено спочатку оновлення, але коли метод перезавантаження, здається, перезавантажує сторінку, не встановлюючи вкладку, не впевнений, у чому проблема.
Doug Molineux

2
Це також працює фільтри / послуги? Набуття небажаного стійкого стану. Редагувати: все-таки виправдано відповідь на питання правильно, і це дуже корисно. Дякую
надайте

10
Не забудьте ввести $routeйого в контролер, щоб це працювало.
Ніл

6
@alphapilgrim Модуль ngRoute більше не є частиною ядра angular.js file. Якщо ви продовжуєте використовувати, $routeProviderтепер вам потрібно буде включити angular-route.jsу свій HTML:
Альваро Жоао

3
$ state.reload (), якщо ви використовуєте stateProvider
Lalit Rao

314

$route.reload()реініціалізуватиме контролери, але не служби. Якщо ви хочете скинути весь стан вашої програми, ви можете скористатися:

$window.location.reload();

Це стандартний метод DOM, до якого ви можете отримати ін'єкцію послуги $ window .

Якщо ви хочете, щоб перезавантажити сторінку з сервера, наприклад, коли ви використовуєте Django або інший веб-фреймворк і хочете свіже візуалізація на стороні сервера, передайте trueяк параметр reload, як пояснено в документах . Оскільки для цього потрібна взаємодія з сервером, це буде повільніше, тому робіть це лише за потреби

Кутовий 2

Вищесказане відноситься до кутового 1. Я не використовую Кутові 2, виглядає як послуги різні, там є Router, Locationі DOCUMENT. Я там не перевіряв різну поведінку


2
Варто зазначити, що так чи інакше не слід зберігати стан у службах, щоб вимагати «перезапуску» служб.
andersonvom

19
Хто це каже? Де слід зберігати кешовані дані?
danza

5
Я натрапив на багато і багато помилок через дані, що зберігаються в сервісах, роблячи їх державними, а не без громадянства. Якщо ми не говоримо про службу кешування (у такому випадку, не було б інтерфейсу для її очищення), я б утримував дані від служб і в контролерах. Наприклад, можна зберігати дані в localStorage та користуватися послугою для доступу до них. Це звільнить послугу від зберігання даних безпосередньо в ній.
andersonvom

2
@danza Де слід зберігати кешовані дані? ... модельний об’єкт? Howver Angular зробив жахливу роботу, називаючи свої складові MVCS. Я зберігаю об’єкти моделей, які можна вводити через API module.value. Тоді різні API, які я визначив у службі ng, які змінюють об'єкт моделі, працюють більше, як команди.
jusopi

2
Звичайно, це спрацює, але це не є хорошою практикою. Дивіться документацію про $ window , причину його використання пояснюємо на початку: Хоча вікно доступне в усьому світі в JavaScript, це викликає проблеми з встановленням, оскільки це глобальна змінна. У кутовій формі ми завжди посилаємось на нього через службу $ window, тому його можна відмінити, видалити або знущатись для тестування
danza

38

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

$location.path('/path1/path2');
$route.reload();

6
Не знаю, чому, але, здається, тут не працює метод .reload (). Це нічого не переробляє.
mircobabini

28

Якщо ви використовуєте кутовий ui-роутер, це буде найкращим рішенням.

$scope.myLoadingFunction = function() {
    $state.reload();
};

У моєму проекті cli після розгортання на спільному хостингу. Коли я перезавантажую свій проект, його помилка 404 для вирішення цього питання використовується. Якщо я додаю "використовувати хеш", то він працює з "#", але я не хочу цього, чи є спосіб його вирішити.
Т. Шашват

24

Ну, можливо, ви забули додати "$ 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>

кутовийJS

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

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

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


7

Якщо ви хочете оновити контролер під час оновлення будь-яких служб, які ви використовуєте, ви можете скористатися цим рішенням:

  • Введіть $ 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, а також ви можете назвати його Refresh або Re-Render .


2
це для маршрутизатора ui не для кутових.
dgzornoza

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();
}

FYI - Кутовий 7: "Перезавантаження властивостей" не існує для типу "Місцезнаходження" ".
ACEG

@Cristina дякує вашій інформації. Я використовую це перед кутовим 7
Thilina Sampath

5

Найпростішим рішенням я вважав:

додайте "/" до маршруту, який потрібно перезавантажувати кожного разу, коли повертаєтесь.

наприклад:

замість наступного

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

використання,

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

2
@PardeepJain Це працювало для мене. Ось чому це відповідь. Ви спростували мою відповідь?
diyoda_

1
ні, зовсім не так, ваша відповідь не так вже й погана. дивно, я зараз не знаю, чому те саме не працює для мене в angular2.
Pardeep Jain

2
Ідеальне рішення. Думає!
симон

Це працює, навіть якщо ваш початковий шлях є коренем програми - /: O Мій маршрут зараз виглядає так://
MadPhysicist

У Angular 6 він працює і після використання # same може бути використаний і для Angular2. подумайте так
Т. Шашват

5

Спробуйте одне з наступного:

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

4

Я отримав цей робочий код для видалення кешу та перезавантаження сторінки

Вид

        <a class="btn" ng-click="reload()">
            <i class="icon-reload"></i> 
        </a>

Контролер

Інжектори: $ range, $ 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();

-8

Я багато місяців боровся з цією проблемою, і єдине рішення, яке працювало на мене, це:

var landingUrl = "http://www.ytopic.es"; //URL complete
$window.location.href = landingUrl;

4
Це навряд чи інше, ніж те, $window.location.reload()що, зокрема, згадується, що ОП не працює належним чином.
Усі працівники мають важливе значення
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.