一尘不染

Angular JS UI路由器如何从父级重定向到子状态?

angularjs

使用onEnter重定向到状态时,如果新状态是当前状态的子级,则会发生无限循环。

例:

$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'

什么时候:

$state.go 'inventory.low'

被调用后,状态inventory被重新初始化,导致其被再次调用=无限循环。

但是,如果重定向状态为:

$state.go 'otherStateThatIsNotAChild'

不会发生此问题。我假设父状态正在重新初始化,但是为什么呢?

  1. 为什么在子状态上.go调用父状态会被重新初始化?
  2. 那么,您将如何处理重定向到子状态?

阅读 263

收藏
2020-07-04

共1个答案

一尘不染

1)为什么在子状态上调用.go时会重新初始化父状态?

在进行过渡时,任何$ state.go / transitionTo都将导致 当前进行中的
过渡被取代。被取代的进程中转换将立即取消。由于在inventory调用所有状态的onEnters时尚未完成向原始过渡的转换,因此取消了原始过渡,并从先前处于活动状态的状态开始了
新的 过渡inventory.low

参见ui-router src https://github.com/angular-ui/ui-
router/blob/master/src/state.js#L897 …

2)那么,您将如何处理重定向到子状态?

你可以…

  • $state.go$timeout()允许重新定向之前的原始过渡才能完成。
  • 从您的控制器调用$ state.go。过渡完成后,UI-router从ui-view指令调用控制器。

无论如何,请务必确保您的应用程序这样重定向。如果用户直接导航到清单的其他任何子状态(例如inventory.high),则重定向仍会发生,从而迫使他们达到inventory.low原定的目的。

2020-07-04