AngularJs: Recharger la page

135
<a ng-href="#" class="navbar-brand" title="home" data-translate>PORTAL_NAME</a>

Je veux recharger la page. Comment puis-je faire ceci?

user880386
la source

Réponses:

265

Vous pouvez utiliser la reloadméthode du $routeservice. Injectez $routedans votre contrôleur puis créez une méthode reloadRoutesur votre $scope.

$scope.reloadRoute = function() {
   $route.reload();
}

Ensuite, vous pouvez l'utiliser sur le lien comme ceci:

<a ng-click="reloadRoute()" class="navbar-brand" title="home"  data-translate>PORTAL_NAME</a>

Cette méthode provoquera le rechargement de l'itinéraire actuel. Si vous souhaitez cependant effectuer une actualisation complète, vous pouvez injecter $windowet utiliser cela:

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


Edition ultérieure (ui-router):

Comme mentionné par JamesEddyEdwards et Dunc dans leurs réponses, si vous utilisez angular-ui / ui-router, vous pouvez utiliser la méthode suivante pour recharger l'état / la route en cours. Injectez simplement $stateau lieu de $routeet vous avez:

$scope.reloadRoute = function() {
    $state.reload();
};
Alexandrin Rus
la source
2
C'est une bonne réponse si vous souhaitez désespérément angulariser le rechargement.
spikeheap
Comment puis-je changer ce comportement globalement au lieu d'ajouter une action à tous les liens
OMGPOP
@OMGPOP Qu'entendez-vous exactement par global pour tous les liens?
Alexandrin Rus
je veux dire, pour tous les liens, vous devez le faire. est-il possible de configurer une fois pour tous les liens?
OMGPOP
@AlexandrinRus ceci me donne les [$ rootScope: infdig] 10 itérations $ digest () atteintes. Abandon!
alphapilgrim le
52

windowobjet est rendu disponible via le $windowservice pour des tests et des moqueries plus faciles , vous pouvez utiliser quelque chose comme:

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

Et :

<a ng-click="reloadPage"  class="navbar-brand" title="home"  data-translate>PORTAL_NAME</a>

En remarque, je ne pense pas que $ route.reload () recharge réellement la page, mais seulement la route .

Florian F.
la source
2
Je recommande d'utiliser $windowau lieu de window.
Jeroen
Merci pour votre contribution. Pouvez-vous nous expliquer pourquoi?
Florian F.
1
Oui désolé. Il est mieux expliqué par la $windowdocumentation , principalement parce reloadPagequ'il serait (mieux) testable lorsqu'il est utilisé $window.
Jeroen
19
 location.reload(); 

Fait l'affaire.

<a ng-click="reload()">

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

Pas besoin de routes ou de quoi que ce soit de vieux js

user3806549
la source
2
aime la simplicité!
Shawn de Wet
14

Similaire à la réponse d'Alexandrin, mais en utilisant $ state plutôt que $ route:

(D'après la réponse SO de JimTheDev ici .)

$scope.reloadState = function() {
   $state.go($state.current, {}, {reload: true});
}

<a ng-click="reloadState()" ... 
Dunc
la source
9

Si vous utilisez Angulars ui-router plus avancé que je recommanderais sans hésiter, vous pouvez maintenant simplement utiliser:

$state.reload();

Ce qui fait essentiellement la même chose que la réponse de Dunc.

JamesEddyEdwards
la source
5

Ma solution pour éviter la boucle infinie était de créer un autre état ayant effectué la redirection:

$stateProvider.state('app.admin.main', {
    url: '/admin/main',
    authenticate: 'admin',
    controller: ($state, $window) => {
      $state.go('app.admin.overview').then(() => {
        $window.location.reload();
      });
    }
  });
Gucu112
la source
2

Angulaire 2+

J'ai trouvé ceci en recherchant Angular 2+, voici donc le chemin:

$window.location.reload();
Nitin Jadhav
la source
1
ce n'est pas spécifique à angular, d'ailleurs, sa manière javascript.
Nitin Jadhav
1

C'est assez facile à utiliser $route.reload()(n'oubliez pas d'injecter $ route dans votre contrôleur), mais à partir de votre exemple, vous pouvez simplement utiliser "href" au lieu de "ng-href":

<a href=""  class="navbar-brand" title="home"  data-translate>PORTAL_NAME</a>

Il vous suffit d'utiliser ng-href pour protéger l'utilisateur des liens non valides causés par un clic avant qu'Angular n'ait remplacé le contenu des balises {{}}.

spikeheap
la source
$ route fait partie de ng.route.IRouteService ??
cracker
1

Sur Angular 1.5 - après avoir essayé certaines des solutions ci-dessus voulant recharger uniquement les données sans actualisation complète de la page, j'ai eu des problèmes pour charger correctement les données. J'ai remarqué cependant que lorsque je vais sur une autre route et que je reviens au courant, tout fonctionne bien, mais quand je veux recharger uniquement la route actuelle en utilisant $route.reload(), alors une partie du code n'est pas exécutée correctement. Ensuite, j'ai essayé de rediriger vers l'itinéraire actuel de la manière suivante:

$scope.someFuncName = function () {
    //go to another route
    $location.path('/another-route');
};

et dans la configuration du module, ajoutez-en un autre when:

.config(['$routeProvider', function($routeProvider) {
     $routeProvider.when('/first-page', {
         templateUrl: '/first-template',
         controller: 'SomeCtrl'
     }).when('/another-route', {//this is the new "when"
         redirectTo: '/first-page'
     });
}])

et cela fonctionne très bien pour moi. Il n'actualise pas la page entière, mais provoque uniquement le rechargement du contrôleur et du modèle actuels. Je sais que c'est un peu piraté, mais c'est la seule solution que j'ai trouvée.

Vivanov
la source
un moyen plus simple pourrait être var reload = $location.url(); $location.url(''); $timeout(function() { $location.url(reload); });; pas besoin de créer des itinéraires aléatoires. Mais il serait intéressant de voir quel code ne réévalue pas pour vous. Il semble que même les redirectTos et les resolvefonctions se réexécutent normalement$route.reload() (regardez le fichier console.log).
Hashbrown
1
<a title="Pending Employee Approvals" href="" ng-click="viewPendingApprovals(1)">
                    <i class="fa fa-user" aria-hidden="true"></i>
                    <span class="button_badge">{{pendingEmployeeApprovalCount}}</span>
                </a>

et dans le contrôleur

 $scope.viewPendingApprovals = function(type) {
                if (window.location.hash.substring(window.location.hash.lastIndexOf('/') + 1, window.location.hash.length) == type) {
                    location.reload();
                } else {
                    $state.go("home.pendingApproval", { id: sessionStorage.typeToLoad });
                }
            };

et dans le fichier d'itinéraire

.state('home.pendingApproval', {
        url: '/pendingApproval/:id',
        templateUrl: 'app/components/approvals/pendingApprovalList.html',
        controller: 'pendingApprovalListController'
    })

Donc, si l'id passé dans l'url est le même que ce qui vient de la fonction appelée en cliquant sur l'ancre, alors rechargez simplement, sinon suivez l'itinéraire demandé.

S'il vous plaît, aidez-moi à améliorer cette réponse, si cela vous aide. Toutes les suggestions sont les bienvenues.

AMRESH PANDEY
la source
Cela m'a pris un mois pour comprendre pourquoi la page ne se recharge pas
sam
0

Cela peut être fait en appelant la méthode reload () de l'objet window en JavaScript brut

window.location.reload();
Skillz
la source
0

Cela peut être fait en appelant la méthode reload () en JavaScript.

location.reload();
Madhusanka Edirimanna
la source