2017-03-07 102 views
2

角度1.6.1和ui-router 1.0.0rc;角度ui路由器1.0.0rc转换取代重定向

我遇到了ui-router问题,同时从一个状态重定向到另一个状态。

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 

注:全球有所有,它是用于身份验证控件时加载的状态,当用户没有解决一个问题:

// 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,但从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'{})) 

有没有人有重定向的解决方案,或者可以看到我是否正确使用全局捕获?全部捕获都会导致死亡循环,但这是次要的首先触发它的重定向拒绝问题。

+0

这可能是因为我的用法是不正确的,但不知道为什么重定向触发器'transition.onError'。一个补丁可以改进匹配条件:'$ transition.onError({to:state =>!state.redirectTo},trans => trans.router.stateService.go('intro'));'而不是一个''。 onError({},...)' – Billiam

回答

0

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

+0

return trans.router.stateService.target('stateB'); –

+0

虽然返回值被忽略onError挂钩,所以上述解决方案将不适用于你的情况。 –

+0

“trans”不是有效的提供者。你能给出一个实际可行的代码示例吗? –

3

当您在前一个状态更改事件完成之前尝试触发状态更改时,会发生过渡暂停错误。 解决此问题的一种简单方法是在超时后调用状态更改。它允许当前状态改变完成,然后触发下一个状态改变。

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

注:此处的超时没有定义的时候,那只是意味着当前所有工序均由内部完成后,它将被执行

+1

这个答案适合我。 +1(什么白痴给它一个减号?) –

+0

@AuntJamaima哈哈!很高兴它为你工作 – kartik

+1

布里尔。 TA!工作过一种享受。不能不理解为什么这是-1! – dewd