Angular ui-router 1.0.0rc转换在重定向

时间:2017-03-07 22:09:48

标签: angularjs redirect angular-ui-router

Angular 1.6.1和ui-router 1.0.0rc;

我在使用ui-router时遇到问题,同时从一个州重定向到另一个州。

TransitionRejection已注册,因为它已被取代。

Transition #1 r0: Started  -> "Transition#1( 'intro'{} -> 'foo'{} )"
Transition #1 r0: <- Rejected "Transition#1( 'intro'{} -> 'foo'{} )", reason: TransitionRejection(type: 2, message: The transition has been superseded by a different transition, detail: 'bar'{"id":"uuid-1234-uuid"})
Transition #2 r0: Ignored  <> "Transition#2( 'intro'{} -> 'intro'{} )"
Transition #3 r0: Started  -> "Transition#3( 'intro'{} -> 'bar'{"id":"uuid-1234-uuid"} )"
Transition #3 r0: <- Success  "Transition#3( 'intro'{} -> 'bar'{"id":"uuid-1234-uuid"} )", final state: bar

注意:全局范围内有一个全部捕获,当用户在加载状态时无法解析时,它用于auth控制:

// state 'intro' is '/'
.config($urlRouterProvider => {
  $urlRouterProvider.otherwise('/'); 
})
.run(($transitions, $trace) => {
  $trace.enable('TRANSITION');
  $transitions.onError({}, trans => trans.router.stateService.go('intro'));
}

转换代码段

// there is no foo component, it's a straight redirect
.component('bar', {
  template: someTemplate,
  controller: someCtrl
})
.config($stateProvider => {
  let states = [
    {
      name: 'foo',
      url: '/foo',
      redirectTo: { state: 'bar', params: { id: 'uuid-1234-uuid' } }
    },
    {
      name: 'bar',
      url: '/bar/:id',
      component: 'bar'
    }
  ];

  states.forEach(s => $stateProvider.state(s));
})

intro -> foo的这个示例中,最终它会以正确的状态bar结束,其他转换(不是从intro(default)转到bar,而是来自{{ 1}}到baz, qux, ..)最后进入无限过渡循环。

例如,从bar转到qux,这应该重定向到foo,但会被bar循环捕获:(我没有qux -> intro的早期错误消息,因为浏览器崩溃了)

qux -> foo

有没有人有重定向的解决方案,或者可以看看我是否正确使用全局catch-all? Catch all导致死循环,但这是第二次触发重定向拒绝问题的次要因素。

3 个答案:

答案 0 :(得分:6)

当您尝试在先前的状态更改事件完成之前触发状态更改时,会发生转换取代错误。 解决此问题的一种简单方法是在超时后调用状态更改。这允许完成当前状态更改,然后触发下一个状态更改。

 $timeout(function(){
   $state.go('statename')
})

注意:此处的超时没有定义的时间,这意味着它将在所有当前进程完成后执行

答案 1 :(得分:0)

如果从转换挂钩而不是使用stateService.go返回目标状态,那么就我目前对ui-router的理解而言,这个问题应该消失。

答案 2 :(得分:0)

在1.0.20版中 使用trans.router.stateService.target('sth')代替$ state.go('sth)