Angulaire JS ui-routeur comment rediriger vers un état enfant d'un parent?
Lors de l'utilisation de onEnter pour rediriger vers un etat, si le nouvel état est un enfant de l'état actuel, une boucle infinie se produit.
Exemple:
$stateProvider
.state 'inventory',
url: '/inventory'
templateUrl: 'views/inventory.html'
controller: 'InventoryCtrl'
onEnter: () ->
$state.go 'inventory.low'
.state 'inventory.low',
url: '/low'
templateUrl: 'views/inventory-table.html'
controller: 'LowInventoryCtrl'
Lorsque:
$state.go 'inventory.low'
Est appelée, l'état inventory
est ré-initialisé, l'amenant à être appelé de nouveau = boucle infinie.
Toutefois, si la redirection de l'état est:
$state.go 'otherStateThatIsNotAChild'
Ce problème ne se produit pas. Je suppose que le parent de l'etat est en train d'être ré-initialisé, mais pourquoi?
- Pourquoi le parent état d'être réinitialisé lors de la
.go
est appelée sur un état d'enfant? - Comment, alors, voulez-vous gérer la redirection vers un état d'enfant?
source d'informationauteur TaylorMac
Vous devez vous connecter pour publier un commentaire.
Alors qu'une transition est en cours, tout $état.aller/transitionTo sera la cause de la actuellement dans le processus de de transition d'être Remplacé. Un processus de transition qui est remplacée est immédiatement annulée. Depuis l'original de votre transition vers
inventory
n'est pas terminée au moment où tous les membres onEnters sont appelés, la transition originale est annulée et une nouveau transition àinventory.low
est démarré à partir de l'actif de l'état.Voir ui-router src https://github.com/angular-ui/ui-router/blob/master/src/state.js#L897 ...
Vous pourriez...
$state.go
dans un$timeout()
pour permettre la transition originale pour terminer avant de la rediriger.Dans tous les cas, être très sûr que vous voulez que votre application de redirection de ce genre. Si un utilisateur accédant directement à n'importe quel autre enfant de l'état de l'inventaire (comme
inventory.high
), la redirection va encore se produire, les forçant àinventory.low
qui ne seraient pas ce qu'ils voulaient.J'ai eu le même problème. La solution la plus simple que j'ai trouvé est d'écouter les modifications de l'état et de la rediriger vers votre état d'enfant à partir de là.
C'est une sorte de hack qui permet de rediriger les routes à l'enfant, les états par défaut. Il n'est pas nécessaire de faire
url: ''
ou$state.go()
ils ne fonctionnent pas correctement.Donc, dans
config
fichier:Dans
state
fichier:J'ai fait un exemple sur l'essentiel: https://gist.github.com/nikoloza/4ab3a94a3c6511bb1dac
Vous avez besoin de prendre du recul et de réfléchir à ce que vous essayez d'atteindre. Quel est l'intérêt d'avoir un état quand il fait c'est de la redirection vers un état d'enfant?
Concernant votre première question, parent états sont toujours activé lorsque vous arrivez à un état d'enfant, ce comportement est extrêmement utile pour le partage de données entre les états, et sans imbriquée à l'routage serait impossible (ou plutôt n'aurait pas de sens).
Comme pour la 2ème question, j'ai travaillé sur quelques gros angulaire apps et je n'ai pas encore trouvé moi-même avoir besoin de le faire.
OK, croyez-le ou pas, autant je déteste le dire, pour l'instant, je suis tombé sur un scénario où j'avais besoin pour ce faire. J'ai un
profile/userName
route (techniquement, cela devrait êtreprofile/userName/details
) et unprofile/userName/products
route, je voulais avoir une vue master pour les deux états, mais en même temps je voulais que leprofile/userName
itinéraire avoir une url propre, comme:profile/mike62
PASprofile/mike62/details
. J'ai donc fini par le faire:Fini par l'atteindre, comme cela, il existe de nombreuses façons:
dans mon
publicProfile
contrôleur d'état (c'est la base de l'état):Oui, il ne se sent hacky mais maintenant je sais qu'il y a certains cas où nous voulons pour ce faire, althopugh nous pourrions repenser notre conception de l'état, tout à fait. Un autre, plus sale façon serait de vérifier l'état actuel de $timeout avec un petit retard à l'intérieur de l'état de base, si nous ne sommes pas sur la
publicProfile.products
état, nous naviguons vers notre préféré/de facto de l'état depublicProfile.details
.Il semble que vous essayez de définir une valeur par défaut de l'enfant de l'état.
C'est un fréquemment posées question à propos de l'interface utilisateur du routeur: Comment faire: configurer une valeur par défaut/index état d'enfant
Le tl;dr est d'utiliser états abstraits par les paramètres
abstract: true
dans l'état parent. Si vous ajoutez plusieurs enfant, les états, il sera par défaut à la première enfant de l'état.Par pdvorchik sa réponse sur le liées GitHub filil y a une solution simple pour ce qui a fonctionné parfaitement pour moi, composé d'emballage de la
$state.go
appel à un.finally()
appel à assurez-vous que la première transition se termine avant qu'un nouveau est commencé.Après @Chris T de l'explication, il semble que la solution la plus propre consiste à écouter le
$stateChangeSuccess
événement:Où redirige contiendra toute la route des redirections peuvent se produire. Merci à tous!
Ne pas faire le bas de l'inventaire de l'état d'un enfant de l'état.