angular-ui-router: lösen Sie auf der root-Zustand
Soweit ich das verstanden habe, ui.router
Haben Sie $stateProvider
drin ist, kann man schreiben $stateProvider.state()
schreiben Sie
.state('account', {
url: '/account',
template: '<ui-view/>'
})
.state('account.register', {
url: '/register',
templateUrl: '/account/views/register.html',
data: { title: 'Create Account' },
controller: 'AccountRegister'
})
aber 'account' ist ein Kind eine Art root-Zustand.
Also mein Gedanke ist, den root-Zustand des ui.router hat eine <ui-view/>
, wie 'account'
hat die Vorlage '<ui-view/>'
, so index.html wäre der root-Zustand. Auch 'home'
mit url: '/'
wäre oder nicht eher ein Kind dieses root-Zustand.
und wenn ich bin in der Lage, Zugriff auf den root-Zustand und sagen, es sollte lösen ein Benutzer service diese aufgelöst Wert sollte auf alle Staaten (oder besser für jeden Staat, der ist ein Kind des Wurzel-Zustands, aka alle). Das Benutzer-service-Versprechen macht ein $http.get('/api/user/status')
und es gibt {"user":{id: "userid", role: "role"}} or {"user":null}
Dies würde garantieren, dass der Wert, der zurückgegeben wird, durch den Benutzer-service wird immer aufgefüllt.
Wie erhalte ich Zugriff auf den root-Zustand und sagen, es beheben sollten, z.B. User.get()
?
Oder lass es mich anders formulieren.
Einem user-Objekt vorhanden sein, um alle Controller.
Die Informationen über den aktuell angemeldeten Benutzer geliefert wird, durch ein $http.get('/api/user/status")
Das ist das problem und ich bin auf der Suche für eine CHEMISCHE Lösung, die, vorausgesetzt die api bedient, ist zu 100% sicher, dass ein user-Objekt gesetzt ist, aka das Versprechen wird immer erfüllt, auch bekannt als "warten auf die Verheißung zu beheben, bevor Sie fortfahren".
- Ich löste es anders. Wenn sich ein Benutzer anmeldet
$window.sessionStorage.token
eingestellt ist. In das Modul .config :$rootScope.$on('$locationChangeStart',function(){ $rootScope.loggedin = !!window.sessionStorage.token;})
dann in der Ansichtng-show="$root.loggedin"
oderng-show="!$root.loggedin"
funktioniert zuverlässig und besser als ui-router $stateChangeStart. Der Betreuer ist nicht hilfreich bei allen entweder. - Ich nehme an, Sie sind vertraut mit der Verwendung des Staates zu lösen Vermögen? github.com/angular-ui/ui-router/wiki#resolve
- Dieser Artikel beschreibt die Verwendung des resolve-Eigenschaft, um pre-load-Ressourcen für ALLE Routen: jvandemo.com/....
- Ja, aber ich war auf der Suche für eine Lösung, die ist TROCKEN. Und, wie ich schrieb, Benutzer meldet sich an -> token gespeichert sessionStorage. Auf der server-Seite, die Ressource dienen Endpunkt der token auf Gültigkeit überprüft. Und es gibt eine AuthInterceptor Dienst, leitet zu einer login-Bildschirm wenn der status 401 oder 403.
- Der ganze Punkt, der zweite Artikel ist, dass es eine CHEMISCHE Lösung für das, was Sie suchen.
- Nein, es ist nicht, ich muss angeben beheben: in jeder route (state). Auch ist es nicht eine Antwort auf die ursprüngliche Frage, die etwa anbringen lösen der root-Zustand, auch bekannt als die Wurzel allen Staaten (Routen).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haftungsausschluss — messing, um mit Ihnen root-scope ist nicht eine gute Idee. Wenn Sie dies Lesen, beachten Sie bitte, dass der OP, @dalu, Wunde bis canning auf dieser Strecke und löste sein Problem mit http-Abfangjäger. Noch — es war ziemlich lustig, diese Frage zu beantworten, so dass Sie vielleicht zu genießen, Experimentieren mit selbst:
Ist es vielleicht ein wenig spät, aber hier geht
Wie bereits erwähnt in den Kommentaren und aus meiner Erfahrung so weit, das ist nicht möglich, mit dem ui-router api (
v0.2.13
) zu sehen, als Sie bereits erklären, die wahre Ursache Staat, namens""
. Sieht aus wie es gewesen, einen pull-request für die letzten paar Jahre über das, was Sie suchen, aber es sieht nicht wie es geht, überall.Den root-Zustand die Eigenschaften sind wie folgt:
Sagte, dass, wenn Sie möchten, erweitern Sie den router, um diese Funktionalität hinzufügen, Sie können dies tun, ziemlich leicht, indem Sie die Dekoration der
$stateProvider
:Beachten, dass es zwei
current
s:$delegate.current
- die raw -""
Staats - und$delegate.$current
- seine Hülle.Ich habe ein bisschen einen Haken, obwohl, vor diesem wird die Lösung, die Sie gesucht haben. Jedes mal, wenn Sie navigieren Sie zu einem neuen Staat, Sie machen andere Anfrage, die gelöst werden, bevor Sie fortfahren. Dies bedeutet, dass diese Lösung nicht viel besser als die Ereignisbehandlung auf
$stateChangeStart
, oder einige"top"
Zustand. Ich kann mir denken, drei Tricks aus der Spitze von meinem Kopf:Denke ich, schließlich bin ich verpflichtet, Sie daran zu erinnern, vorsichtig zu sein mit der Tatsache, dass Sie arbeiten auf der root-Ebene. Also, ich meine, so vorsichtig, wie Sie sein sollten, wenn es etwas zu tun in root-Ebene.
Ich hoffe, das beantwortet Ihre Frage!
Als der ui-router
1.0.0-beta.3
jetzt können Sie dies leicht tun mit transition-Haken:Den Status-manager wartet, bis das Versprechen, Sie zu beheben, bevor Sie fortfahren laden von Staaten.
WICHTIG: Stellen Sie sicher, dass
userService
lädt die Daten nur einmal, und wenn es bereits geladen, es sollte einfach nur wieder ein bereits gelöst Versprechen. Da die callback-oben genannt werden auf jeden Zustandsübergang. Umgang mit login/logout zum Beispiel, können Sie erstellen eineuserService.invalidate()
und rufen Sie nach dem login/logout-aber bevor du ein$state.reload()
.Ist hier anders Vorgehen
Fügen Sie folgenden code zu Ihrer app
.run
blockVerwenden
$state.go('name', {}, {reload:true});
Ansatzes für den Fall, Sie brauchen, um zu aktualisierenauthData
auf Status ändern (also, dass der übergang Zustand startet immer vonroot
sonst beheben, ladenauthData
wird nie aufgerufen werden, da einmal root geladen ist, braucht es nie zu bekommen, wieder angerufen {außer page-reload}).Verwenden Sie die
resolve
- Attribut auf die Staatliche definition.finden Sie unter: