角UI路由器1.0.0rc过渡取代上重定向

Bil*_*iam 4 redirect angularjs angular-ui-router

角1.6.1和UI路由器1.0.0rc;

我正在与UI路由器的问题,而从一个状态重定向到另一个。

A 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
Run Code Online (Sandbox Code Playgroud)

注意:全局存在全部内容,当用户在加载状态时无法解析时,将其用于身份验证控制:

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

过渡片段

// 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));
})
Run Code Online (Sandbox Code Playgroud)

虽然在intro -> foo最终示例中它最终以正确的状态结束,但bar其他过渡(当不是从intro(default)bar,而是从baz, qux, ..bar)则以无休止的过渡循环结束。

例如,从去quxfoo,这应该重定向到bar,但被逮住一个qux -> intro循环:(我没有更早的错误消息qux -> foo,因为浏览器崩溃)

TransitionRejection(type: 2, message: The transition has been superseded by a different transition, detail: Transition#2704( 'qux'{} -> 'intro'{} ))
Run Code Online (Sandbox Code Playgroud)

是否有人对重定向有解决方案,或者可以查看我是否正确使用了全局捕获?捕获所有导致死亡循环,但这是次要的问题重定向消息拒绝触发它摆在首位。

kar*_*tik 9

当您尝试在上一个状态更改事件完成之前触发状态更改时,将发生过渡替换错误。解决此问题的一种简单方法是在超时后调用状态更改。这样就可以完成当前状态更改,然后触发下一个状态更改。

 $timeout(function(){
   $state.go('statename')
})
Run Code Online (Sandbox Code Playgroud)

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