309 votes

Comment recharger ou rendre à nouveau la page entière à l'aide d'AngularJS ?

Après avoir rendu la page entière sur la base de plusieurs contextes d'utilisateur et après avoir fait plusieurs $http je veux que l'utilisateur puisse changer de contexte et tout restituer à nouveau (en renvoyant toutes les demandes d $http demandes, etc). Si je redirige simplement l'utilisateur ailleurs, les choses fonctionnent correctement :

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

Si j'utilise $window.location.reload() alors certains des $http demandes sur auth.impersonate(username) qui sont en attente d'une réponse sont annulées, donc je ne peux pas utiliser ça. De plus, le hack $location.path($location.path()) ne fonctionne pas non plus (rien ne se passe).

Existe-t-il un autre moyen de rendre à nouveau la page sans relancer manuellement toutes les requêtes ?

0 votes

Comme le dit Alvaro Joao ci-dessous, vous devez utiliser angular-route.js pour que cela fonctionne. bennadel.com/blog/

0 votes

Duplicata possible de AngularJs : Rechargement de la page

408voto

andersonvom Points 2905

Pour mémoire, pour forcer angular à refaire le rendu de la page courante, vous pouvez utiliser :

$route.reload();

Selon AngularJS documentation :

Demande au service $route de recharger l'itinéraire actuel même si $location n'a pas changé.

En conséquence, ngView crée une nouvelle portée, réinstalle le contrôleur.

6 votes

Merci pour le commentaire, pour une raison quelconque, je semble obtenir un comportement légèrement différent lorsque j'utilise $route.reload() par rapport à un rafraîchissement normal. Par exemple, un onglet est défini pour s'afficher initialement lors de l'actualisation, mais lorsque la méthode de rechargement semble recharger la page sans définir l'onglet, je ne sais pas quel est le problème.

1 votes

Est-il possible de recharger un contrôleur spécifique qui n'est pas sur la vue ou l'état actuel ?

2 votes

Est-ce que cela fait fonctionner les filtres/services également ? J'obtiens un état persistant indésirable. Edit : Toujours upvoted pour avoir répondu correctement à la question et c'est super utile. Merci pour votre aide.

320voto

danza Points 657

$route.reload() réinitialisera les contrôleurs mais pas les services. Si vous voulez réinitialiser l'état entier de votre application, vous pouvez utiliser :

$window.location.reload();

Il s'agit d'un méthode standard DOM auquel vous pouvez accéder en injectant le $fenêtre service.

Si vous voulez être sûr de recharger la page depuis le serveur, par exemple lorsque vous utilisez Django ou un autre framework web et que vous voulez un nouveau rendu côté serveur, passez la commande true en tant que paramètre de reload comme expliqué dans les docs . Comme cela nécessite une interaction avec le serveur, cela sera plus lent, alors ne le faites que si nécessaire.

Angulaire 2

Ce qui précède s'applique à Angular 1. Je n'utilise pas Angular 2, il semblerait que les services soient différents dans ce cas. Router , Location et le DOCUMENT . Je n'y ai pas testé de comportements différents

2 votes

Il est intéressant de noter que l'on ne devrait pas stocker d'état dans les services de toute façon pour exiger que les services soient "redémarrés".

20 votes

Qui dit ça ? Où doit-on stocker les données en cache ?

6 votes

Je suis tombé sur des tas et des tas de bogues dus au fait que les données sont stockées dans les services, ce qui les rend étatiques plutôt qu'apatrides. A moins que nous ne parlions d'un service de cache (dans ce cas, il y aurait une interface pour le vider), je garderais les données hors des services et dans les contrôleurs. Par exemple, on pourrait garder les données dans localStorage, et utiliser un service pour y accéder. Cela libérerait le service de la nécessité de conserver les données directement en son sein.

39voto

Kumar Sambhav Points 751

Pour recharger la page pour un chemin d'accès donné :-.

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

6 votes

Je ne sais pas pourquoi mais la méthode .reload() ne semble pas fonctionner ici. Elle ne réalise rien.

29voto

Neha DP Points 291

Si vous utilisez angulaire ui-routeur ce sera la meilleure solution.

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

24voto

Peut-être avez-vous oublié d'ajouter "$route" lors de la déclaration des dépendances de votre contrôleur :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X