Gibt es eine Möglichkeit, den vorherigen Status des aktuellen Status abzurufen?
Zum Beispiel möchte ich wissen, was der vorherige Zustand vor dem aktuellen Zustand B war (wobei der vorherige Zustand Zustand A gewesen wäre).
Ich kann es nicht auf den Github-Dokumentenseiten des UI-Routers finden.
Antworten:
Der UI-Router verfolgt den vorherigen Status nach dem Übergang nicht mehr, aber das Ereignis
$stateChangeSuccess
wird gesendet,$rootScope
wenn sich der Status ändert.Sie sollten in der Lage sein, den vorherigen Status von diesem Ereignis zu erfassen (
from
ist der Status, den Sie verlassen):quelle
Ich verwende Entschlossenheit, um die aktuellen Statusdaten zu speichern, bevor ich in den neuen Status wechsle:
quelle
$stateChangeSuccess
$stateChangeSuccess
funktioniert, geschieht dies auf globaler Ebene, was die meiste Zeit nicht wirklich benötigt wird.$state.current
Objekt is :{name: "", url: "^", views: null, abstract: true}
.Aus Gründen der Lesbarkeit werde ich meine Lösung (basierend auf der Antwort von stu.salsbury) hier platzieren.
Fügen Sie diesen Code zur abstrakten Vorlage Ihrer App hinzu, damit er auf jeder Seite ausgeführt wird.
Verfolgt die Änderungen in rootScope. Es ist ziemlich praktisch.
quelle
Im folgenden Beispiel habe ich eine erstellt
decorator
(wird in der Konfigurationsphase nur einmal pro App ausgeführt) und dem$state
Service eine zusätzliche Eigenschaft hinzugefügt, sodass bei diesem Ansatz keine globalen Variablen$rootscope
zu anderen Diensten hinzugefügt werden und keine zusätzliche Abhängigkeit zu anderen Diensten als erforderlich ist$state
.In meinem Beispiel musste ich einen Benutzer auf die Indexseite umleiten, wenn er bereits angemeldet war und wenn er ihn nach der Anmeldung nicht auf die vorherige "geschützte" Seite umleiten sollte.
Die einzigen unbekannten Dienste (für Sie), die ich benutze, sind
authenticationFactory
undappSettings
:authenticationFactory
verwaltet nur die Benutzeranmeldung. In diesem Fall verwende ich nur eine Methode, um festzustellen, ob der Benutzer angemeldet ist oder nicht.appSettings
sind Konstanten, nur um nicht überall Strings zu verwenden.appSettings.states.login
undappSettings.states.register
enthalten den Namen des Staates für die Anmelde- und Registrierungs-URL.Dann müssen Sie in jedem
controller
/service
etc$state
Service injizieren und können auf die aktuelle und vorherige URL wie folgt zugreifen:$state.current.name
$state.previous.route.name
Über die Chrome-Konsole:
Implementierung:
(Ich benutze
angular-ui-router v0.2.17
undangularjs v1.4.9
)quelle
Fügen Sie $ state auf $ stateChangeStart eine neue Eigenschaft mit dem Namen {previous} hinzu
Jetzt können Sie überall dort, wo Sie möchten, $ state verwenden, den Sie zuvor zur Verfügung haben
Und benutze es so:
quelle
Ich stecke mit dem gleichen Problem fest und finde den einfachsten Weg, dies zu tun ...
ODER
(Wenn Sie möchten, dass es besser testbar ist, fügen Sie den $ window-Dienst in Ihren Controller ein und verwenden Sie $ window.history.back ()).
quelle
Ich benutze einen ähnlichen Ansatz wie Endy Tjahjono.
Ich speichere den Wert des aktuellen Status, bevor ich einen Übergang vornehme. Sehen wir uns ein Beispiel an. Stellen Sie sich dies in einer Funktion vor, die ausgeführt wird, wenn Sie auf das klicken, was den Übergang auslöst:
Der Schlüssel hier ist das params-Objekt (eine Karte der Parameter, die an den Status gesendet werden) ->
{ previousState : { name : $state.current.name } }
Hinweis: Beachten Sie, dass ich nur das Namensattribut des $ state-Objekts "speichere", da dies das einzige ist, was ich zum Speichern des Status benötige. Aber wir könnten das ganze Staatsobjekt haben.
Geben Sie dann "was auch immer" wie folgt definiert an:
Hier ist der Schlüsselpunkt das params-Objekt.
In diesem Zustand können wir dann den vorherigen Zustand wie folgt erhalten:
quelle
Hier ist eine wirklich elegante Lösung von Chris Thielen UI-Router-Extras: $ previousState
previous
ist ein Objekt, das so aussieht:{ state: fromState, params: fromParams }
wobei fromState der vorherige Status und fromParams die vorherigen Statusparameter sind.quelle
Ok, ich weiß, dass ich zu spät zur Party komme, aber ich bin neu in Angular. Ich versuche, dies hier in den John Papa Style Guide zu integrieren . Ich wollte dies wiederverwendbar machen, also habe ich es in einem Block erstellt. Folgendes habe ich mir ausgedacht:
previousStateProvider
Kern Modul
core.config
Jede Kritik an diesem Code hilft mir nur. Lassen Sie mich wissen, wo ich diesen Code verbessern kann.
quelle
Wenn Sie diese Funktionalität nur benötigen und in mehr als einem Controller verwenden möchten, ist dies ein einfacher Dienst zum Verfolgen des Routenverlaufs:
Dabei ist der 'Kern' in .module ('Kern') der Name Ihrer App / Ihres Moduls. Benötigen Sie den Dienst als Abhängigkeit von Ihrem Controller, dann können Sie in Ihrem Controller Folgendes tun:
$scope.routeHistory = RouterTracker.getRouteHistory()
quelle
Ich verfolge frühere Zustände in $ rootScope , sodass ich bei Bedarf einfach die folgende Codezeile aufrufe .
In App.js :
quelle
Für UI-Router (> = 1.0) sind StateChange-Ereignisse veraltet. Klicken Sie hier, um eine vollständige Migrationsanleitung zu erhalten
So rufen Sie den vorherigen Status des aktuellen Status in UI-Router 1.0+ ab:
quelle
Eine wirklich einfache Lösung besteht darin, die Zeichenfolge $ state.current.name zu bearbeiten und alles auszuschneiden, einschließlich und nach dem letzten '.' - Sie erhalten den Namen des übergeordneten Staates. Dies funktioniert nicht, wenn Sie häufig zwischen Status wechseln, da nur der aktuelle Pfad zurückgemeldet wird. Aber wenn Ihre Zustände dem entsprechen, wo Sie sich tatsächlich befinden, funktioniert dies.
quelle
$state.go('^')
wird dies erreichenSie können den Status folgendermaßen zurückgeben:
Ein Beispiel:
quelle