【问题标题】:$state transition after rejected promise Angular ui-router拒绝承诺 Angular ui-router 后的 $state 转换
【发布时间】:2014-03-19 01:25:25
【问题描述】:

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

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

简单地说:

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

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

这个问题适用于 0.xx 版本,很多东西在 1.xx 版本中发生了变化

【问题讨论】:

  • 你能提供更多代码吗?这是在$digest 循环内吗?
  • 抱歉,现在更清楚了。这是我的 $stateProvider 应用程序配置,它正在解决我的一个状态。

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


【解决方案1】:

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

根据维基:

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

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


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

【讨论】:

  • 谢谢。没想到这个。
  • 我自己尝试过监听 $stateChangeError 事件,但从未看到它被触发,即使我知道 $q.reject 已被调用。这会使应用处于之前的状态,没有任何通知,或者在第一次加载的情况下,处于未知状态。
  • 您需要确保在已加载的控制器中处理$stateChangeError(例如,在层次结构中高于您的解析调用)。如果您需要捕获根状态,请在您的 html 或 body 标记上使用 ng-controller 作为站点范围内始终加载的控制器。
  • @MattWay 更好:使用运行块,并收听$rootScope。
  • ui-router.github.io/guide/ng1/… $stateChangeError 已弃用,使用转换挂钩
【解决方案2】:

您误解了 Promise 的工作原理。 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(..)
  }
)

【讨论】:

  • 他在问如何处理resolve时的reject,他很清楚什么是promise reject!
猜你喜欢
  • 1970-01-01
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 2015-06-01
  • 2019-11-25
  • 1970-01-01
  • 2017-09-04
相关资源
最近更新 更多