Come ricaricare o ripetere il rendering dell'intera pagina usando AngularJS


299

Dopo aver eseguito il rendering dell'intera pagina in base a più contesti utente e aver fatto diverse $httprichieste, voglio che l'utente sia in grado di cambiare contesto e ripetere il rendering di tutto (reinviando tutte le $httprichieste, ecc.). Se reindirizzo l'utente da qualche altra parte, le cose funzionano correttamente:

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

Se lo utilizzo $window.location.reload(), alcune delle $httprichieste in auth.impersonate(username)attesa di una risposta vengono annullate, quindi non posso utilizzarlo. Inoltre, l'hacking $location.path($location.path())non funziona neanche (non succede nulla).

Esiste un altro modo per eseguire nuovamente il rendering della pagina senza inviare nuovamente tutte le richieste manualmente?


Come dice Alvaro Joao di seguito, è necessario utilizzare angular-route.js per farlo funzionare. bennadel.com/blog/…
Yvonne Aburrow

Risposte:


404

Per la cronaca, per forzare l'angolazione del rendering della pagina corrente, è possibile utilizzare:

$route.reload();

Secondo la documentazione di AngularJS :

Fa sì che il servizio $ route ricarichi il percorso corrente anche se $ location non è cambiato.

Di conseguenza, ngView crea un nuovo ambito, reinventa il controller.


6
Grazie per il commento, per qualche motivo mi sembra di avere un comportamento leggermente diverso quando lo uso $route.reload()rispetto a un aggiornamento normale. Ad esempio, una scheda è impostata per essere mostrata inizialmente all'aggiornamento, ma quando il metodo di ricarica sembra ricaricare la pagina senza impostare la scheda, non sono sicuro di quale sia il problema.
Doug Molineux,

2
Questo esegue anche filtri / servizi? Ottenere uno stato persistente indesiderato. Modifica: ancora votato per aver risposto correttamente alla domanda e questo è molto utile. Grazie
concedi il

10
Ricordarsi di effettuare l'iniezione $routeal controller affinché funzioni.
Neel,

6
@alphapilgrim Il modulo ngRoute non fa più parte del core angular.js file. Se continui a utilizzare, $routeProviderdovrai ora includere angular-route.jsnel tuo codice HTML:
Alvaro Joao

3
$ state.reload () se si utilizza stateProvider
Lalit Rao,

314

$route.reload()reinizializzerà i controller ma non i servizi. Se si desidera ripristinare l'intero stato dell'applicazione è possibile utilizzare:

$window.location.reload();

Questo è un metodo DOM standard a cui è possibile accedere iniettando il servizio $ window .

Se si desidera essere sicuri di ricaricare la pagina dal server, ad esempio quando si utilizza Django o un altro framework Web e si desidera un nuovo rendering lato server, passare truecome parametro a reload, come spiegato nei documenti . Poiché ciò richiede l'interazione con il server, sarà più lento, quindi fallo solo se necessario

Angolare 2

Quanto sopra vale anche per angolare 1. Non sto usando angolare 2, sembra che i servizi sono diversi c'è, c'è Router, Locatione la DOCUMENT. Non ho testato comportamenti diversi lì


2
Vale la pena notare che non si dovrebbe comunque memorizzare lo stato nei servizi per richiedere il "riavvio" dei servizi.
Andersonvom,

19
Chi lo dice? Dove si dovrebbe archiviare i dati memorizzati nella cache?
danza,

5
Mi sono imbattuto in un sacco di bug a causa della memorizzazione dei dati nei servizi, rendendoli con stato piuttosto che senza stato. A meno che non stiamo parlando di un servizio di memorizzazione nella cache (nel qual caso, ci sarebbe un'interfaccia per scaricarlo), terrei i dati fuori dai servizi e nei controller. Ad esempio, è possibile conservare i dati in localStorage e utilizzare un servizio per accedervi. Ciò libererebbe il servizio dal mantenere i dati direttamente al suo interno.
Andersonvom,

2
@danza Dove si dovrebbe archiviare i dati memorizzati nella cache? ... un oggetto modello? Howver Angular ha svolto un terribile lavoro nel nominare i propri componenti MVCS. Conservo oggetti modello iniettabili tramite l'API module.value. Quindi le varie API che ho definito su un servizio ng che alterano l'oggetto modello funzionano più come i comandi.
jusopi,

2
Certo, funzionerà, ma non è una buona pratica. Vedi la documentazione su $ window , il motivo per usarlo è spiegato all'inizio: Mentre window è globalmente disponibile in JavaScript, causa problemi di testabilità, perché è una variabile globale. In angolare ci riferiamo sempre ad esso attraverso il servizio $ window, quindi potrebbe essere ignorato, rimosso o deriso per i test
danza

38

Per ricaricare la pagina per un determinato percorso: -

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

6
Non so perché ma il metodo .reload () sembra non funzionare qui. Non rimuove nulla.
mircobabini,

28

Se stai usando un UI-router angolare, questa sarà la soluzione migliore.

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

Nel mio progetto cli dopo la distribuzione nell'hosting condiviso. Quando sto ricaricando il mio progetto, ho usato l'errore 404 per risolvere questo. Se aggiungo 'usa hash', allora funziona con '#', ma non lo voglio, c'è un modo per risolverlo.
T. Shashwat,

24

Beh, forse hai dimenticato di aggiungere "$ route" quando hai dichiarato le dipendenze del tuo Controller:

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

9

Solo per ricaricare tutto, usa window.location.reload (); con angularjs

Guarda un esempio funzionante

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/


7

Se si desidera aggiornare il controller durante l'aggiornamento di tutti i servizi in uso, è possibile utilizzare questa soluzione:

  • Iniettare $ state

vale a dire

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

Questo aggiornerà il controller e anche l'HTML che puoi chiamare Aggiorna o Ri-Rendering .


2
questo è per il router dell'interfaccia utente non per angolare.
dgzornoza,

6

Prima di Angular 2 (AngularJs)

Attraverso il percorso

$route.reload();

Se si desidera ricaricare l'intera applicazione

$window.location.reload();

Angolare 2+

import { Location } from '@angular/common';

constructor(private location: Location) {}

ngOnInit() {  }

load() {
    this.location.reload()
}

O

constructor(private location: Location) {}

ngOnInit() {  }

Methods (){
    this.ngOnInit();
}

FYI - Angular 7: "Proprietà 'ricaricare' non esiste sul tipo 'Posizione'".
ACEG

@Cristina ringrazia le tue informazioni. Lo uso prima dell'angolare 7
Thilina Sampath il

5

La soluzione più semplice che immaginavo era,

aggiungi '/' al percorso che vuoi ricaricare ogni volta che torni.

per esempio:

invece di quanto segue

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

uso,

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

2
@PardeepJain Questo ha funzionato per me. Ecco perché questa è una risposta. Hai votato in negativo la mia risposta?
Diyoda_

1
no per niente, la tua risposta non è così negativa da sottovalutare. fantastico, non so perché lo stesso non funzioni per me in angular2.
Pardeep Jain,

2
Soluzione perfetta Thks!
simon,

Funziona anche se il tuo percorso originale è la radice dell'applicazione - /: O Il mio percorso ora è simile al seguente://
MadPhysicist

In Angular 6 funziona dopo aver usato # same può essere usato anche per Angular2. la penso così
T. Shashwat, il

5

Prova una delle seguenti:

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

4

Ho ottenuto questo codice funzionante per rimuovere la cache e ricaricare la pagina

Visualizza

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

controllore

Iniettori: $ scope, $ state, $ stateParams, $ templateCache

       $scope.reload = function() { // To Reload anypage
            $templateCache.removeAll();     
            $state.transitionTo($state.current, $stateParams, { reload: true, inherit: true, notify: true });
        };

3

Utilizzare il seguente codice senza una notifica di ricarica intima all'utente. Renderà la pagina

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

-8

Ho avuto una dura lotta con questo problema per mesi e l'unica soluzione che ha funzionato per me è questa:

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

4
Ciò non è affatto diverso dal fare $window.location.reload()che l'OP menziona specificamente non funziona correttamente nel suo caso.
Tutti i lavoratori sono essenziali il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.