So laden Sie die gesamte Seite mit AngularJS neu oder rendern sie erneut

299

Nachdem $httpich die gesamte Seite basierend auf mehreren Benutzerkontexten gerendert und mehrere Anforderungen gestellt habe, möchte ich, dass der Benutzer die Kontexte wechseln und alles erneut rendern kann (erneutes Senden aller $httpAnforderungen usw.). Wenn ich den Benutzer nur an eine andere Stelle umleitung, funktionieren die Dinge ordnungsgemäß:

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

Wenn ich verwende $window.location.reload(), werden einige der $httpAnfragen auth.impersonate(username), die auf eine Antwort warten, abgebrochen, sodass ich das nicht verwenden kann. Außerdem $location.path($location.path())funktioniert der Hack auch nicht (nichts passiert).

Gibt es eine andere Möglichkeit, die Seite neu zu rendern, ohne alle Anforderungen erneut manuell auszugeben?

andersonvom
quelle
Wie Alvaro Joao weiter unten sagt, müssen Sie angle-route.js verwenden, damit dies funktioniert. bennadel.com/blog/…
Yvonne Aburrow
Mögliches Duplikat von AngularJs: Seite neu
laden

Antworten:

404

Für den Datensatz können Sie Folgendes verwenden, um den Winkel zum erneuten Rendern der aktuellen Seite zu erzwingen:

$route.reload();

Laut AngularJS- Dokumentation :

Bewirkt, dass der $ route-Dienst die aktuelle Route neu lädt, auch wenn sich der Standort nicht geändert hat.

Infolgedessen erstellt ngView einen neuen Bereich und stellt den Controller wieder her.

andersonvom
quelle
6
Vielen Dank für den Kommentar. Aus irgendeinem Grund scheint sich mein Verhalten etwas anders zu verhalten als $route.reload()bei einer normalen Aktualisierung. Beispielsweise wird eine Registerkarte so eingestellt, dass sie beim Aktualisieren anfänglich angezeigt wird. Wenn die Methode zum erneuten Laden die Seite jedoch neu zu laden scheint, ohne die Registerkarte festzulegen, ist das Problem nicht sicher.
Doug Molineux
2
Führt dies auch Filter / Dienste aus? Unerwünschter anhaltender Zustand. Bearbeiten: Immer noch positiv bewertet, um die Frage richtig zu beantworten und das ist super hilfreich. Vielen Dank
gewähren
10
Denken Sie daran, $routein den Controller zu injizieren , damit dies funktioniert.
Neel
6
@alphapilgrim Das ngRoute-Modul ist nicht mehr Teil des Kerns angular.js file. Wenn Sie weiterhin verwenden, müssen $routeProviderSie jetzt angular-route.jsin Ihren HTML-Code aufnehmen:
Alvaro Joao
3
$ state.reload (), wenn Sie stateProvider
Lalit Rao
314

$route.reload()wird die Controller neu initialisieren, aber nicht die Dienste. Wenn Sie den gesamten Status Ihrer Anwendung zurücksetzen möchten, können Sie Folgendes verwenden:

$window.location.reload();

Dies ist eine Standard-DOM-Methode, auf die Sie zugreifen können, um den $ window- Dienst zu injizieren .

Wenn Sie sicher sein möchten, dass die Seite vom Server neu geladen wird, z. B. wenn Sie Django oder ein anderes Webframework verwenden und ein neues serverseitiges Rendern wünschen, übergeben Sie trueals Parameter an reload, wie in den Dokumenten erläutert . Da dies eine Interaktion mit dem Server erfordert, ist diese langsamer, daher nur bei Bedarf

Winkel 2

Das Obige gilt für Angular 1. Ich nicht Angular 2 verwende, sieht aus wie die Dienste unterscheiden sich dort, gibt es Router, Locationund das DOCUMENT. Ich habe dort keine unterschiedlichen Verhaltensweisen getestet

Danza
quelle
2
Es ist erwähnenswert, dass man den Status sowieso nicht in den Diensten speichern sollte, um zu verlangen, dass Dienste "neu gestartet" werden.
andersonvom
19
Wer sagt das? Wo soll man zwischengespeicherte Daten speichern?
Danza
5
Ich bin auf viele, viele Fehler gestoßen, weil Daten in Diensten gespeichert wurden, was sie eher zustandsbehaftet als zustandslos macht. Sofern es sich nicht um einen Caching-Dienst handelt (in diesem Fall gibt es eine Schnittstelle zum Löschen), würde ich Daten von Diensten und in den Controllern fernhalten. Beispielsweise könnte man Daten in localStorage behalten und einen Dienst verwenden, um darauf zuzugreifen. Dies würde den Dienst davon befreien, Daten direkt darin zu speichern.
andersonvom
2
@danza Wo soll man zwischengespeicherte Daten speichern? ... ein Modellobjekt? Howver Angular hat schreckliche Arbeit geleistet, um ihre MVCS-Bestandteile zu benennen. Ich behalte injizierbare Modellobjekte über die module.value-API. Dann funktionieren die verschiedenen APIs, die ich in einem ng-Dienst definiert habe und die das Modellobjekt ändern, eher wie Befehle.
Jusopi
2
Sicher, das wird funktionieren, aber es ist keine gute Praxis. In der Dokumentation zu $ ​​window wird der Grund für die Verwendung am Anfang erläutert: Während window in JavaScript global verfügbar ist, verursacht es Testbarkeitsprobleme, da es sich um eine globale Variable handelt. In Angular verweisen wir immer über den $ window-Dienst darauf, sodass es zum Testen überschrieben, entfernt oder verspottet werden kann
Danza
38

Zum erneuten Laden der Seite für einen bestimmten Routenpfad: -

$location.path('/path1/path2');
$route.reload();
Kumar Sambhav
quelle
6
Ich weiß nicht warum, aber die Methode .reload () scheint hier nicht zu funktionieren. Es realisiert nichts.
Mircobabini
28

Wenn Sie einen eckigen UI-Router verwenden, ist dies die beste Lösung.

$scope.myLoadingFunction = function() {
    $state.reload();
};
Neha DP
quelle
In meinem CLI-Projekt nach der Bereitstellung auf Shared Hosting. Wenn ich mein Projekt neu lade, wird der Fehler 404 zur Behebung dieses Problems verwendet. Wenn ich 'use hash' hinzufüge, funktioniert es mit '#', aber ich möchte das nicht, gibt es eine Möglichkeit, wie es gelöst werden kann.
T. Shashwat
24

Vielleicht haben Sie vergessen, "$ route" hinzuzufügen, als Sie die Abhängigkeiten Ihres Controllers deklarierten:

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

Verwenden Sie window.location.reload (), um alles neu zu laden. mit eckigen js

Schauen Sie sich das Arbeitsbeispiel an

HTML

<div ng-controller="MyCtrl">  
<button  ng-click="reloadPage();">Reset</button>
</div>

eckigJS

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

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

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

Vaibs
quelle
7

Wenn Sie den Controller aktualisieren möchten, während Sie die von Ihnen verwendeten Dienste aktualisieren, können Sie folgende Lösung verwenden:

  • Injizieren Sie $ state

dh

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

Dadurch werden der Controller und der HTML- Code aktualisiert . Sie können ihn auch als Aktualisieren oder erneut rendern bezeichnen .

Saurabh Sarathe
quelle
2
Dies ist für UI-Router nicht für Winkel.
Dgzornoza
6

Vor Angular 2 (AngularJs)

Durch die Route

$route.reload();

Wenn Sie die gesamte Anwendung neu laden möchten

$window.location.reload();

Winkel 2+

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

constructor(private location: Location) {}

ngOnInit() {  }

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

Oder

constructor(private location: Location) {}

ngOnInit() {  }

Methods (){
    this.ngOnInit();
}
Thilina Sampath
quelle
Zu Ihrer Information - Winkel 7: "Die Eigenschaft 'reload' ist für den Typ 'Location' nicht vorhanden".
ACEG
@ Cristina danke für deine Informationen. Ich benutze dies vor Winkel 7
Thilina Sampath
5

Die einfachste Lösung, die ich mir vorgestellt habe, war:

Fügen Sie der Route, die bei jeder Rückkehr neu geladen werden soll, '/' hinzu.

z.B:

anstelle der folgenden

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

verwenden,

$routeProvider
  .when('/About/', { //notice the '/' at the end 
    templateUrl: 'about.html',
    controller: 'AboutCtrl'
  })
diyoda_
quelle
2
@PardeepJain Das hat bei mir funktioniert. Deshalb ist dies eine Antwort. Hast du meine Antwort abgelehnt?
diyoda_
1
Nein, überhaupt nicht, Ihre Antwort ist nicht so schlecht, um sie abzustimmen. Erstaunlich, ich weiß jetzt nicht, warum dasselbe bei Angular2 nicht für mich funktioniert.
Pardeep Jain
2
Perfekte Lösung. Danke!
Simon
Dies funktioniert auch, wenn Ihr ursprünglicher Pfad das Stammverzeichnis der Anwendung ist - /: O Meine Route sieht jetzt folgendermaßen aus://
MadPhysicist
In Angular 6 funktioniert es nach Verwendung von # same kann auch für Angular2 verwendet werden. denke schon
T. Shashwat
5

Versuchen Sie eine der folgenden Möglichkeiten:

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

Ich habe diesen Arbeitscode zum Entfernen des Caches und zum erneuten Laden der Seite erhalten

Aussicht

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

Regler

Injektoren: $ scope, $ state, $ stateParams, $ templateCache

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

Verwenden Sie den folgenden Code ohne vertrauliche Benachrichtigung beim erneuten Laden an den Benutzer. Die Seite wird gerendert

var currentPageTemplate = $route.current.templateUrl;
$templateCache.remove(currentPageTemplate);
$window.location.reload();
KARTHIKEYAN.A
quelle
-8

Ich habe seit Monaten einen harten Kampf mit diesem Problem und die einzige Lösung, die für mich funktioniert hat, ist folgende:

var landingUrl = "http://www.ytopic.es"; //URL complete
$window.location.href = landingUrl;
Jose Ramon Leon Somovilla
quelle
4
Dies ist kaum anders als das, $window.location.reload()was das OP ausdrücklich erwähnt, funktioniert in seinem Fall nicht richtig.
Alle Arbeiter sind essentiell