Existe uma maneira de obter o estado anterior do estado atual?
Por exemplo, eu gostaria de saber qual era o estado anterior antes do estado atual B (onde o estado anterior teria sido o estado A).
Não consigo encontrá-lo nas páginas de documentos do ui-router github.
Respostas:
O ui-router não rastreia o estado anterior depois da transição, mas o evento
$stateChangeSuccess
é transmitido no$rootScope
quando o estado muda.Você deve conseguir capturar o estado anterior desse evento (
from
é o estado que você está saindo):fonte
Uso resolv para salvar os dados do estado atual antes de passar para o novo estado:
fonte
$stateChangeSuccess
$stateChangeSuccess
obras, ele é feito em nível global, o que não é realmente necessário na maioria das vezes.$state.current
é objecto:{name: "", url: "^", views: null, abstract: true}
.Para facilitar a leitura, colocarei minha solução (baseada na resposta de stu.salsbury) aqui.
Adicione esse código ao modelo abstrato do seu aplicativo para que ele seja executado em todas as páginas.
Mantém o controle das alterações no rootScope. É muito útil.
fonte
No exemplo a seguir, criei um
decorator
(é executado apenas uma vez por aplicativo na fase de configuração) e adiciona uma propriedade extra ao$state
serviço, portanto, essa abordagem não adiciona variáveis globais$rootscope
e não exige a adição de nenhuma dependência extra a outros serviços$state
.No meu exemplo, eu precisava redirecionar um usuário para a página de índice quando ele já estava conectado e quando ele não deveria redirecioná-lo para a página "protegida" anterior após o login.
Os únicos serviços desconhecidos (para você) que eu uso são
authenticationFactory
eappSettings
:authenticationFactory
apenas administra o login do usuário. Nesse caso, utilizo apenas um método para identificar se o usuário está logado ou não.appSettings
são constantes apenas para não usar seqüências de caracteres em todos os lugares.appSettings.states.login
eappSettings.states.register
contenha o nome do estado para o URL de login e registro.Então, em qualquer
controller
/service
etc, você precisa injetar$state
serviço e pode acessar os URLs atual e anterior como este:$state.current.name
$state.previous.route.name
No console do Chrome:
Implementação:
(Eu estou usando
angular-ui-router v0.2.17
eangularjs v1.4.9
)fonte
Adicione uma nova propriedade chamada {previous} a $ state em $ stateChangeStart
Agora, em qualquer lugar que você precisar, pode usar $ state, você terá disponível anteriormente
E use-o assim:
fonte
Estou com o mesmo problema e encontro a maneira mais fácil de fazer isso ...
OU
(Se você quiser que seja mais testável, injete o serviço $ window no seu controlador e use $ window.history.back ()).
fonte
Eu uso uma abordagem semelhante ao que Endy Tjahjono faz.
O que faço é salvar o valor do estado atual antes de fazer uma transição. Vamos ver em um exemplo; imagine isso dentro de uma função executada ao clicar no que quer que desencadeie a transição:
A chave aqui é o objeto params (um mapa dos parâmetros que serão enviados ao estado) ->
{ previousState : { name : $state.current.name } }
Nota: observe que estou apenas "salvando" o atributo name do objeto $ state, porque é a única coisa que preciso para salvar o estado. Mas poderíamos ter todo o objeto de estado.
Em seguida, indique "o que quer que" tenha sido definido assim:
Aqui, o ponto principal é o objeto params.
Então, dentro desse estado, podemos obter o estado anterior assim:
fonte
Aqui está uma solução realmente elegante de Chris Thielen ui-router-extras: $ previousState
previous
é um objeto que se parece com:{ state: fromState, params: fromParams }
where fromState é o estado anterior e fromParams são os parâmetros de estado anteriores.fonte
Ok, eu sei que estou atrasado para a festa aqui, mas sou novo em angular. Estou tentando fazer isso se encaixar no guia de estilo de John Papa aqui. Eu queria tornar isso reutilizável, então criei em um bloco. Aqui está o que eu vim com:
previousStateProvider
core.module
core.config
Qualquer crítica a este código só me ajudará; portanto, deixe-me saber onde posso melhorar esse código.
fonte
Se você só precisa dessa funcionalidade e deseja usá-la em mais de um controlador, este é um serviço simples para rastrear o histórico de rotas:
onde o 'core' no .module ('core') seria o nome do seu aplicativo / módulo. Exija o serviço como uma dependência do seu controlador e, em seu controlador, você poderá:
$scope.routeHistory = RouterTracker.getRouteHistory()
fonte
Eu acompanho os estados anteriores em $ rootScope , portanto, sempre que precisar, chamarei a linha de código abaixo.
No App.js :
fonte
Para o roteador de interface do usuário (> = 1.0), os eventos StateChange foram preteridos. Para um guia completo de migração, clique em aqui
Para obter o estado anterior do estado atual no UI-Router 1.0+:
fonte
Uma solução realmente simples é apenas editar a string $ state.current.name e cortar tudo, incluindo e após o último '.' - você obtém o nome do estado pai. Isso não funciona se você pular muito entre os estados, porque apenas analisa o caminho atual. Mas se seus estados correspondem a onde você realmente está, então isso funciona.
fonte
$state.go('^')
vai conseguir issoVocê pode retornar o estado desta maneira:
Um exemplo:
fonte