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?
quelle
$state.go($state.current, {}, {reload: true});
funktioniert nicht, wenncache: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.Ich fand heraus, dass die Antwort von JimTheDev nur funktionierte, wenn die Statusdefinition
cache:false
festgelegt 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
quelle
Die richtige Antwort:
$window.location.reload(true);
quelle
$window
anstelle vonwindow
Ich habe eine Lösung gefunden, die mir dabei geholfen hat. Das Setzen
cache-view="false"
aufion-view
Tag hat mein Problem behoben.<ion-view cache-view="false" view-title="My Title!"> .... </ion-view>
quelle
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 });
quelle
$scope.$on('$ionicView.beforeEnter', function(scopes, states) { if (states.fromCache) { ... } }
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.quelle
Keine der oben genannten Lösungen funktionierte für einen Hostnamen, der sich von unterscheidet
localhost
!Ich musste
notify: false
der Liste der Optionen, an die ich übergebe$state.go
, etwas hinzufügen , um zu vermeiden, dass Angular Change Listener$window.location.reload
angerufen 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 .
quelle
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.
quelle
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.
quelle
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 anzuzeigenWenn der Neuladevorgang abgeschlossen ist, kann ich
$ionicLoading.hide()
als Rückruf anrufenSchließ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!
quelle
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);
quelle
.state (url: '/ url', controller: Ctl, templateUrl: 'template.html', cache: false) cache: false ==> hat mein Problem gelöst!
quelle
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 = ''; });
quelle
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
quelle