如何了解ui状态更改取消的情况
所以我在我的应用程序中使用UI路由器,并使用$stateChangeStart
侦听器显示一个加载器,然后使用$stateChangeSuccess
隐藏加载器。 这样我在状态转换之间有一个加载器。
$rootScope.$on('$stateChangeStart',
function (event, toState, toParams, fromState, fromParams) {
///show loader
});
$rootScope.$on('$stateChangeSuccess',
function (event, toState, toParams, fromState, fromParams) {
//hide loader
});
问题:
$stateChangeStart
,显示我的加载器。 $stateChangeSuccess
没有被调用,我的加载程序永远不会被隐藏 (因为我们已经在A中,它不会被重新加载) 那么有没有一种方法可以侦听状态更改取消并隐藏我的装载程序?
更新:我创建了一个Plunk。 在庞克身上,我已经给B超过了10秒的决心。 因此,在解决之前,请单击A.监视控制台以查看状态更改侦听器事件。
2015年7月25日更新,它使用最新的AngularUI路由器:创建新的Plunk。
迄今为止我发现的唯一可持续解决方案是避免使用ui-sref
。 它掩盖了$state.go
的返回值,在这种情况下它是关键。
诀窍是处理由$state.go
返回的transition
承诺
$scope.safeGo = function(stateName){
var transition = $state.go(stateName);
transition.then(function(currentState){
console.log('Transition finished successfully. State is ' + currentState.name);
})
.catch(function(err){
//revert your loader animation here
console.log('Transition failed. State is ' + $state.current.name, err);
})
}
通过$state.transition
属性可以访问同一个对象,但是在转换之间属性为null
并且在$state
广播它的任何事件中也是null
。 因此唯一可靠的选择是获取$state.go
的返回值。
当状态A
选择之前B
得到解决的transition
为诺B
将与理由拒绝Error: transition superseded
。 但是,您仍然需要等到B.resolve
完成。 如果你想避免这种情况,你将不得不自己跟踪自己的状态,因为转换到A
会立即得到解决(因为当B
正在尝试解决时,当前状态仍然是A
)。
更新的运动员
链接地址: http://www.djcxy.com/p/25243.html