Löschen Sie den Verlauf und laden Sie die Seite beim Anmelden / Abmelden mit Ionic Framework neu

80

Ich bin neu in der Entwicklung mobiler Anwendungen mit Ionic. Beim An- und Abmelden muss ich die Seite neu laden, um die Daten zu aktualisieren. Der $state.go('mainPage')Benutzer kehrt jedoch ohne erneutes Laden zur Ansicht zurück. Der dahinter stehende Controller wird nie aufgerufen.

Gibt es eine Möglichkeit, die Geschichte zu löschen und den Zustand in Ionic neu zu laden?

reibungslose Riemenscheibe
quelle

Antworten:

124

Willkommen im Framework! Tatsächlich wird das Routing in Ionic von einem UI-Router gespeist . Sie sollten sich wahrscheinlich diese vorherige SO-Frage ansehen , um verschiedene Möglichkeiten zu finden, dies zu erreichen.

Wenn Sie nur den Status neu laden möchten, können Sie Folgendes verwenden:

$state.go($state.current, {}, {reload: true});

Wenn Sie die Seite tatsächlich neu laden möchten (wie in, Sie möchten alles neu starten), können Sie Folgendes verwenden:

$window.location.reload(true)

Viel Glück!

JimTheDev
quelle
Ich möchte alle CSS / JS-Dateien, die vom Remote-Server abgerufen wurden, in index.html bündeln. Aber ich würde es vorziehen, diese nur neu zu laden, wenn sich etwas geändert hat. Wie soll ich das strukturieren?
Mylord
Ich bin mir nicht sicher, ob ich dich verstehe @mylord. Sprechen Sie über Live-Reload? Vielleicht interessieren Sie sich für den hier diskutierten HTML5-Offline-Cache / Manifest: tmkmobile.wordpress.com/2012/03/04/html5-offline-solution Ich denke, Sie versuchen möglicherweise, etwas anderes als die ursprüngliche Absicht der Frage zu tun.
JimTheDev
13
$ state.go ($ state.current, {}, {reload: true}); Diese Lösung funktioniert bei mir nicht.
IamStalker
@IamStalker Kannst du weitere Informationen oder vielleicht einen Codepen / Fiddle / Plunk als Beispiel geben?
JimTheDev
9
$state.go($state.current, {}, {reload: true});funktioniert nicht, wenn cache:true(was die Standardeinstellung ist, wenn der Cache weggelassen wird) in der Statusdefinition. Getestet in #ionic 1.0.0-RC2 und 1.0.0. Siehe meine Antwort.
ABCD.ca
25

Ich fand heraus, dass die Antwort von JimTheDev nur funktionierte, wenn die Statusdefinition cache:falsefestgelegt war. Mit der Ansicht zwischengespeichert, können Sie tun , $ionicHistory.clearCache()und dann $state.go('app.fooDestinationView')von einem Zustand in einem , wenn Sie die Navigation, die zwischengespeichert wird , sondern muss aktualisiert werden .

Sehen Sie meine Antwort hier, da eine einfache Änderung an Ionic erforderlich ist und ich eine Pull-Anfrage erstellt habe: https://stackoverflow.com/a/30224972/756177

ABCD.ca
quelle
1
Gutes Zeug. Ich verwende dies nicht wirklich in meiner ionischen App, daher schätze ich die Nachverfolgung der Caching-Funktionalität. Sieht so aus, als würde Ihre PR in 1.0.1 gehen. Sobald das veröffentlicht ist, werde ich in meinem ursprünglichen Beitrag eine Notiz machen, die Sie gutschreibt und die Leute auffordert, einen Blick darauf zu werfen.
JimTheDev
18

Die richtige Antwort:

$window.location.reload(true);
EpokK
quelle
1
Diese Antwort wurde als minderwertig gekennzeichnet. Könnten Sie versuchen zu erklären, warum es die richtige Antwort ist?
Jorge Leitao
1
Weil es $windowanstelle vonwindow
EpokK
Sie haben Recht, wenn Sie die Syntax .location.reload verwenden, ist es sinnvoll, $ window zu verwenden. Ich habe meine Antwort oben geändert, damit wir für zukünftige Leser konsistent sind. In bestimmten Fällen kann auch die Syntax $ state.go hilfreich sein.
JimTheDev
Nur diese Antwort hat mir geholfen, nicht die angekreuzte
Michal
Früher mochte ich diesen Ansatz, aber einige Leute berichteten, dass er auf einigen Geräten (Android 4.4, Chrome) eine unendliche Schleife von Neuladungen verursacht.
Oleg Cheremisin
18

Ich habe eine Lösung gefunden, die mir dabei geholfen hat. Das Setzen cache-view="false"auf ion-viewTag hat mein Problem behoben.

<ion-view cache-view="false" view-title="My Title!">
  ....
</ion-view>
Rajeshwar
quelle
Durch Deaktivieren der Cache-Ansicht wird die Leistung erheblich beeinträchtigt. Sie sollten diese Optionen vermeiden. Stattdessen können Sie ionicView-Ereignisse verarbeiten. siehe: stackoverflow.com/questions/25192172/…
Ezain
@ezain, Könnten Sie mir bitte mitteilen, wie sich die Leistung auswirkt?
Rajeshwar
@ Rajeshwar: Wenn das Cache-System aktiviert ist, behält Ionic das gesamte DOM bei, das durch die ausgeblendete Ansicht generiert wurde. Wenn eine Änderungsansicht auftritt, müssen Sie das DOM nicht neu berechnen. Wenn Sie ein schweres DOM haben und es bei allen Übergangsänderungen generieren müssen, können Sie Verzögerungen in den Übergangsanimationen erkennen. Wenn Sie den Cache nur aus Gründen des Neuladens neu laden, verwenden Sie die ionicView-Ereignisse.
Ezain
@ezain, Es gibt so viele Möglichkeiten, diese Funktion zum Deaktivieren des Caches zu implementieren. Ich habe fast alle ausprobiert, nichts hat bei mir funktioniert. Und dieser gab mir, was ich brauche. Und ich sehe keine nennenswerte Verzögerung beim Laden dieser Seite, obwohl die Seite etwas groß ist. Also habe ich diesen Weg vorgezogen als die anderen.
Rajeshwar
11

Das Neuladen der Seite ist nicht der beste Ansatz.

Sie können Statusänderungsereignisse zum erneuten Laden von Daten verarbeiten, ohne die Ansicht selbst neu zu laden.

Lesen Sie hier mehr über den ionicView-Lebenszyklus :

http://blog.ionic.io/navigating-the-changes/

und behandeln Sie das Ereignis beforeEnter zum erneuten Laden der Daten.

$scope.$on('$ionicView.beforeEnter', function(){
  // Any thing you can think of
});
Ezain
quelle
Dies scheint der beste Ansatz zu sein.
Markau
Insbesondere können Sie überprüfen, ob der Status aus dem Cache stammt, und in diesem $scope.$on('$ionicView.beforeEnter', function(scopes, states) { if (states.fromCache) { ... } }
Fall
@ jakub.g Wenn Sie eine Ansicht nicht zwischenspeichern möchten, können Sie den Cache für diese bestimmte Ansicht deaktivieren. Dies ist einfacher.
Ezain
6

In meinem Fall muss ich nur die Ansicht löschen und den Controller neu starten. Ich könnte meine Absicht mit diesem Ausschnitt bekommen:

$ionicHistory.clearCache([$state.current.name]).then(function() {
  $state.reload();
}

Der Cache funktioniert immer noch und es scheint, dass nur die Ansicht gelöscht wird.

ionic --version sagt 1.7.5.

Glaukomorais
quelle
Ein Nachtrag: Wenn der Status Parameter enthält, müssen Sie diese in der Ansichts- / Statusidentifikation definieren. Überprüfen Sie diesen Pastebin: pastebin.com/2CaGYpnz
glaucomorais
Fehler in Ihrem Code Richtige Version $ ionicHistory.clearCache ([$ state.current.name]). Then (function () {$ state.reload ();});
Kirill A
Nur eine Klammer fehlt
user623396
1

Keine der oben genannten Lösungen funktionierte für einen Hostnamen, der sich von unterscheidet localhost!

Ich musste notify: falseder Liste der Optionen, an die ich übergebe $state.go, etwas hinzufügen , um zu vermeiden, dass Angular Change Listener $window.location.reloadangerufen werden , bevor der Anruf aufgerufen wird. Der endgültige Code sieht folgendermaßen aus:

$state.go('home', {}, {reload: true, notify: false});

>>> BEARBEITEN - $ timeout kann abhängig von Ihrem Browser erforderlich sein >>>

$timeout(function () { $window.location.reload(true); }, 100);

<<< BEENDEN DER BEARBEITUNG <<<

Mehr dazu in der UI-Router-Referenz .

Majid Mallis
quelle
0

Ich habe versucht, eine Seite mit anglejs zu aktualisieren, als ich Websites sah, die mich verwirrten, aber kein Code für den Code funktionierte. Dann bekam ich eine Lösung zum erneuten Laden der Seite mit

$state.go('path',null,{reload:true});

Verwenden Sie dies in einer Funktion, die funktioniert.

Krishnaraj
quelle
0

Ich musste den Status neu laden, damit die Bildlaufleisten funktionieren. Sie haben nicht funktioniert, als sie durch einen anderen Staat kamen - "Registrierung". Wenn die App nach der Registrierung zwangsweise geschlossen und erneut geöffnet wurde, dh direkt in den Ausgangszustand überging, funktionierten die Bildlaufleisten. Keine der oben genannten Lösungen hat funktioniert.

Als ich nach der Registrierung ersetzte:

$state.go("home");

mit

window.location = "index.html"; 

Die App wurde neu geladen und die Bildlaufleisten funktionierten.

Tom Andraszek
quelle
0

Der Controller wird nur einmal aufgerufen, und Sie sollten dieses Logikmodell beibehalten. Normalerweise mache ich Folgendes:

Ich erstelle eine Methode $scope.reload(params)

Zu Beginn dieser Methode rufe ich $ionicLoading.show({template:..})auf, um meinen benutzerdefinierten Spinner anzuzeigen

Wenn der Neuladevorgang abgeschlossen ist, kann ich $ionicLoading.hide()als Rückruf anrufen

Schließlich füge ich innerhalb der Schaltfläche REFRESH hinzu ng-click = "reload(params)"

Der einzige Nachteil dieser Lösung ist, dass Sie das Ionennavigationsverlaufssystem verlieren

Hoffe das hilft!

Nourdine Alouane
quelle
0

Wenn Sie nach einer Ansichtsänderung neu laden möchten, müssen Sie

$state.reload('state',{reload:true});

Wenn Sie diese Ansicht zur neuen "Wurzel" machen möchten, können Sie ionic mitteilen, dass die nächste Ansicht die Wurzel sein wird

 $ionicHistory.nextViewOptions({ historyRoot: true });
 $state.go('app.xxx');
 return;

Wenn Sie möchten, dass Ihre Controller nach jeder Ansichtsänderung neu geladen werden

app.config(function ($stateProvider, $urlRouterProvider, $ionicConfigProvider) {

$ionicConfigProvider.views.maxCache(0);
EduLopez
quelle
0

.state (url: '/ url', controller: Ctl, templateUrl: 'template.html', cache: false) cache: false ==> hat mein Problem gelöst!

Mohammed BOUTCHEKKOUCHT
quelle
0

Wie von @ezain hervorgehoben, laden Sie Controller nur dann neu, wenn dies erforderlich ist. Eine andere sauberere Methode zum Aktualisieren von Daten beim Ändern des Status, anstatt den Controller neu zu laden, besteht darin, Broadcast-Ereignisse zu verwenden und solche Ereignisse in Controllern abzuhören, die Daten in Ansichten aktualisieren müssen.

Beispiel: In Ihren Anmelde- / Abmeldefunktionen können Sie Folgendes tun:

$scope.login = function(){
    //After login logic then send a broadcast
    $rootScope.$broadcast("user-logged-in");
    $state.go("mainPage");
};
$scope.logout = function(){
   //After logout logic then send a broadcast
   $rootScope.$broadcast("user-logged-out");
   $state.go("mainPage");
};

Lösen Sie jetzt in Ihrem mainPage-Controller die Änderungen in der Ansicht aus, indem Sie die Funktion $ on verwenden, um die Übertragung im mainPage-Controller wie folgt anzuhören:

$scope.$on("user-logged-in", function(){
     //update mainPage view data here eg. $scope.username = 'John';
});

$scope.$on("user-logged-out", function(){
    //update mainPage view data here eg. $scope.username = '';
});
Dev
quelle
-1

Ich habe viele Methoden ausprobiert, fand diese Methode jedoch absolut korrekt:

$window.location.reload();

Hoffe, dies hilft anderen, die tagelang wie ich mit der Version: Angular 1.5.5, Ionic 1.2.4, Angular-UI-Router 1.0.0 stecken geblieben sind

Grabtasker
quelle