拒绝承诺Angular ui-router后的$ state transition

Sea*_*son 18 javascript url-routing promise angularjs angular-ui-router

我正在使用Angular ui-router并在初始化控制器之前为我的一个状态设置了解析功能.我检索一些数据,循环并匹配URL stateParam,如果找到匹配,解析对控制器的承诺并在promise中返回该对象.这一切都运作良好.

但是,如果未找到匹配项,我只想通过拒绝承诺并运行来重定向到其他状态 $state.go('state');

这个:

deferred.reject();
$state.go('state',{params: 'param'});
Run Code Online (Sandbox Code Playgroud)

但这似乎没有做任何事情.控制器只是挂起,我没有控制台错误或任何东西.有任何想法吗?

这个问题适用于版本0.xx,版本1.xx中的许多内容已经改变

Mat*_*Way 31

$stateChangeError如果路由解析被拒绝,ui-router应该抛出.您需要关注此事件,并在那里触发您的状态转换.

根据维基:

$stateChangeError - 在转换期间发生错误时触发.重要的是要注意,如果您的解析函数(javascript错误,不存在的服务等)中有任何错误,它们将不会传统抛出.您必须侦听此$ stateChangeError事件以捕获所有错误.

https://github.com/angular-ui/ui-router/wiki#wiki-state-change-events


正如@gustavohenke在评论中提到的,放置此处理程序的好地方是您的应用程序的主要.run()功能.

  • @MattWay甚至更好:使用运行块,并在`$ rootScope`中监听. (5认同)
  • 我已经尝试自己监听$ stateChangeError事件,并且从未看到它被触发,即使我知道$ q.reject已被调用.这使应用程序处于先前状态,没有通知,或者,在第一次加载的情况下,处于未知状态. (2认同)