Czy istnieje sposób, aby uzyskać poprzedni stan obecnego stanu?
Na przykład chciałbym wiedzieć, jaki był poprzedni stan przed obecnym stanem B (gdzie poprzedni stan byłby stanem A).
Nie mogę go znaleźć na stronach doc github ui-routera.
Czy istnieje sposób, aby uzyskać poprzedni stan obecnego stanu?
Na przykład chciałbym wiedzieć, jaki był poprzedni stan przed obecnym stanem B (gdzie poprzedni stan byłby stanem A).
Nie mogę go znaleźć na stronach doc github ui-routera.
Odpowiedzi:
ui-router nie śledzi poprzedniego stanu po przejściu, ale zdarzenie
$stateChangeSuccess
jest emitowane w$rootScope
momencie zmiany stanu.Powinieneś być w stanie złapać poprzedni stan z tego wydarzenia (
from
jest to stan, z którego wychodzisz):źródło
Używam rozwiązania, aby zapisać dane bieżącego stanu przed przejściem do nowego stanu:
źródło
$stateChangeSuccess
$stateChangeSuccess
działa, robi to na poziomie globalnym, co nie jest potrzebne przez większość czasu.$state.current
jest obiekt:{name: "", url: "^", views: null, abstract: true}
.Ze względu na czytelność umieszczę tutaj moje rozwiązanie (oparte na anwser stu.salsbury).
Dodaj ten kod do abstrakcyjnego szablonu aplikacji, aby działał na każdej stronie.
Śledzi zmiany w rootScope. Jest całkiem poręczny.
źródło
W poniższym przykładzie utworzyłem
decorator
(działa tylko raz na aplikację w fazie konfiguracji) i dodaje dodatkową właściwość do$state
usługi, więc to podejście nie dodaje zmiennych globalnych$rootscope
do innych usług i nie wymaga dodawania żadnych dodatkowych zależności do innych usług niż$state
.W moim przykładzie musiałem przekierować użytkownika na stronę indeksową, gdy był już zalogowany i kiedy nie miał przekierowywać go na poprzednią „chronioną” stronę po zalogowaniu.
Nieznane tylko usługi (dla ciebie), które używam są
authenticationFactory
iappSettings
:authenticationFactory
po prostu zarządza loginem użytkownika. W tym przypadku używam tylko metody identyfikacji, czy użytkownik jest zalogowany, czy nie.appSettings
są stałymi tylko po to, aby nie używać wszędzie łańcuchów.appSettings.states.login
iappSettings.states.register
zawierać nazwę stanu dla logowania i adresu URL rejestru.Następnie w dowolnym
controller
/service
etc musisz wstrzyknąć$state
usługę i możesz uzyskać dostęp do bieżącego i poprzedniego adresu URL w następujący sposób:$state.current.name
$state.previous.route.name
Z konsoli Chrome:
Realizacja:
(Używam
angular-ui-router v0.2.17
iangularjs v1.4.9
)źródło
Dodaj nową właściwość o nazwie {previous} do $ state na $ stateChangeStart
Teraz gdziekolwiek potrzebujesz, możesz użyć $ state, będziesz mieć poprzednią dostępną
I używaj go w ten sposób:
źródło
Utknąłem z tym samym problemem i znajduję najłatwiejszy sposób, aby to zrobić ...
LUB
(Jeśli chcesz, aby było bardziej testowalne, wstrzyknij usługę $ window do kontrolera i użyj $ window.history.back ()).
źródło
Stosuję podobne podejście do tego, co robi Endy Tjahjono.
To, co robię, to zapisywanie wartości bieżącego stanu przed dokonaniem przejścia. Zobaczmy na przykładzie; wyobraź sobie to wewnątrz funkcji wykonywanej po kliknięciu na cokolwiek wyzwala przejście:
Kluczem jest tutaj obiekt params (mapa parametrów, które zostaną przesłane do stanu) ->
{ previousState : { name : $state.current.name } }
Uwaga: zwróć uwagę, że ja tylko „zapisuję” atrybut name obiektu $ state, ponieważ jest to jedyna rzecz, której potrzebuję do zapisania stanu. Ale moglibyśmy mieć cały obiekt stanu.
Następnie określ „cokolwiek” zostało zdefiniowane w ten sposób:
Tutaj kluczowym punktem jest obiekt params.
Następnie w tym stanie możemy uzyskać poprzedni stan w następujący sposób:
źródło
Oto naprawdę eleganckie rozwiązanie autorstwa Chrisa Thielena ui-router-extras: $ previousState
previous
jest obiektem, który wygląda następująco:{ state: fromState, params: fromParams }
gdzie fromState to poprzedni stan, a fromParams to poprzednie parametry stanu.źródło
Ok, wiem, że spóźniłem się na imprezę tutaj, ale jestem nowy w Angular. Próbuję dopasować to do przewodnika po stylu Johna Papy . Chciałem, aby to było wielokrotnego użytku, więc utworzyłem w bloku. Oto co wymyśliłem:
previousStateProvider
core.module
core.config
Każda krytyka dotycząca tego kodu może mi tylko pomóc, więc daj mi znać, gdzie mogę go ulepszyć.
źródło
Jeśli potrzebujesz tylko tej funkcji i chcesz jej używać w więcej niż jednym kontrolerze, jest to prosta usługa śledzenia historii tras:
gdzie „rdzeń” w .module („rdzeń”) byłby nazwą Twojej aplikacji / modułu. Wymagaj usługi jako zależności od kontrolera, a następnie w kontrolerze możesz wykonać:
$scope.routeHistory = RouterTracker.getRouteHistory()
źródło
Śledzę poprzednie stany w $ rootScope , więc w razie potrzeby po prostu wywołam poniższą linię kodu.
W App.js :
źródło
W przypadku UI-Router (> = 1.0) zdarzenia StateChange zostały wycofane. Aby uzyskać pełny przewodnik po migracji, kliknij tutaj
Aby uzyskać poprzedni stan bieżącego stanu w UI-Router 1.0+:
źródło
Naprawdę prostym rozwiązaniem jest po prostu zmodyfikowanie ciągu $ state.current.name i wycięcie wszystkiego, łącznie z ostatnim znakiem „i po nim”. - otrzymasz nazwę państwa macierzystego. To nie działa, jeśli dużo przeskakujesz między stanami, ponieważ po prostu analizuje bieżącą ścieżkę. Ale jeśli twoje stany odpowiadają temu, gdzie faktycznie jesteś, to działa.
źródło
$state.go('^')
osiągnie toMożesz zwrócić stan w ten sposób:
Przykład:
źródło