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

时间:2014-02-19 00:01:48

标签: javascript angularjs promise angular-ui-router url-routing

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

但是,如果找不到匹配项,我只想通过拒绝承诺并运行$state.go('state');

来重定向到其他州。

简单地说:

deferred.reject();
$state.go('state',{params: 'param'});

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

此问题适用于版本1.xx,版本1.xx中的许多内容已更改

2 个答案:

答案 0 :(得分:31)

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

根据维基:

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

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


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

答案 1 :(得分:-3)

你误解了承诺是如何运作的。 deferred.reject()只是通知deferred.promise它已被拒绝。

var promise = deferred.promise;

promise.then(
  function (result) { 
    // this function runs if the promise was resolved
  },
  function (result) {
    // this function runs if the promise was rejected
    // this is where you should put $state.go(..)
  }
)