Existe-t-il un moyen d'obtenir l'état précédent de l'état actuel?
Par exemple, je voudrais savoir quel était l'état précédent avant l'état actuel B (où l'état précédent aurait été l'état A).
Je ne suis pas en mesure de le trouver dans les pages doc github ui-router.
Réponses:
ui-router ne suit pas l'état précédent une fois qu'il transite, mais l'événement
$stateChangeSuccess
est diffusé le$rootScope
lorsque l'état change.Vous devriez être en mesure d'attraper l'état précédent de cet événement (
from
est l'état que vous quittez):la source
J'utilise la résolution pour enregistrer les données d'état actuel avant de passer au nouvel état:
la source
$stateChangeSuccess
$stateChangeSuccess
travaux, il le fait au niveau mondial, ce qui n'est pas vraiment nécessaire la plupart du temps.$state.current
est objet:{name: "", url: "^", views: null, abstract: true}
.Par souci de lisibilité, je vais placer ma solution (basée sur la réponse de stu.salsbury) ici.
Ajoutez ce code au modèle abstrait de votre application pour qu'il s'exécute sur chaque page.
Garde une trace des changements dans rootScope. C'est assez pratique.
la source
Dans l'exemple suivant, j'ai créé un
decorator
(ne s'exécute qu'une seule fois par application lors de la phase de configuration) et ajoute une propriété supplémentaire au$state
service, de sorte que cette approche n'ajoute pas de variables globales$rootscope
et ne nécessite pas d'ajouter de dépendance supplémentaire à d'autres services que$state
.Dans mon exemple, j'avais besoin de rediriger un utilisateur vers la page d'index quand il était déjà connecté et quand il ne devait pas le rediriger vers la page "protégée" précédente après la connexion.
Les seuls services inconnus (pour vous) que j'utilise sont
authenticationFactory
etappSettings
:authenticationFactory
gère simplement la connexion de l'utilisateur. Dans ce cas, j'utilise uniquement une méthode pour identifier si l'utilisateur est connecté ou non.appSettings
sont des constantes juste pour ne pas utiliser de chaînes partout.appSettings.states.login
etappSettings.states.register
contient le nom de l'état pour l'URL de connexion et d'enregistrement.Ensuite, dans n'importe quel
controller
/service
etc, vous devez injecter le$state
service et vous pouvez accéder à l'url actuelle et précédente comme ceci:$state.current.name
$state.previous.route.name
Depuis la console Chrome:
La mise en oeuvre:
(J'utilise
angular-ui-router v0.2.17
etangularjs v1.4.9
)la source
Ajouter une nouvelle propriété appelée {previous} à $ state sur $ stateChangeStart
Maintenant, partout où vous avez besoin, vous pouvez utiliser $ state, vous aurez le précédent disponible
Et utilisez-le comme ceci:
la source
Je suis coincé avec le même problème et je trouve le moyen le plus simple de le faire ...
OU
(Si vous voulez qu'il soit plus testable, injectez le service $ window dans votre contrôleur et utilisez $ window.history.back ()).
la source
J'utilise une approche similaire à ce que fait Endy Tjahjono.
Ce que je fais, c'est enregistrer la valeur de l'état actuel avant d'effectuer une transition. Voyons sur un exemple; imaginez ceci dans une fonction exécutée en cliquant sur ce qui déclenche la transition:
La clé ici est l'objet params (une carte des paramètres qui seront envoyés à l'état) ->
{ previousState : { name : $state.current.name } }
Remarque: notez que je ne "sauvegarde" que l'attribut name de l'objet $ state, car c'est la seule chose dont j'ai besoin pour sauvegarder l'état. Mais nous pourrions avoir tout l'objet d'état.
Ensuite, indiquez «tout ce qui a été défini comme suit:
Ici, le point clé est l'objet params.
Ensuite, à l'intérieur de cet état, nous pouvons obtenir l'état précédent comme ceci:
la source
Voici une solution vraiment élégante de Chris Thielen ui-router-extras: $ previousState
previous
est un objet qui ressemble à:{ state: fromState, params: fromParams }
où fromState est l'état précédent et fromParams est les paramètres d'état précédent.la source
Ok, je sais que je suis en retard à la fête ici, mais je suis nouveau à angular. J'essaie d'intégrer cela dans le guide de style John Papa ici. Je voulais le rendre réutilisable alors j'ai créé dans un bloc. Voici ce que j'ai trouvé:
previousStateProvider
core.module
core.config
Toute critique sur ce code ne fera que m'aider, alors faites-moi savoir où je peux améliorer ce code.
la source
Si vous avez juste besoin de cette fonctionnalité et que vous souhaitez l'utiliser dans plus d'un contrôleur, il s'agit d'un service simple pour suivre l'historique des itinéraires:
où le 'core' dans .module ('core') serait le nom de votre application / module. Exigez le service en tant que dépendance de votre contrôleur, puis dans votre contrôleur, vous pouvez faire:
$scope.routeHistory = RouterTracker.getRouteHistory()
la source
Je garde une trace des états précédents dans $ rootScope , donc chaque fois que j'en aurai besoin, j'appellerai simplement la ligne de code ci-dessous.
Dans App.js :
la source
Pour UI-Router (> = 1.0), les événements StateChange sont obsolètes. Pour un guide de migration complet, cliquez ici
Pour obtenir l'état précédent de l'état actuel dans UI-Router 1.0+:
la source
Une solution très simple consiste simplement à modifier la chaîne $ state.current.name et à tout supprimer, y compris et après le dernier '.' - vous obtenez le nom de l'état parent. Cela ne fonctionne pas si vous sautez beaucoup entre les états, car il analyse simplement le chemin actuel. Mais si vos états correspondent à l'endroit où vous vous trouvez réellement, cela fonctionne.
la source
$state.go('^')
va accomplir celaVous pouvez renvoyer l'état de cette façon:
Un exemple:
la source