Angularjs 如何在ui路由器中通知状态更改取消?
因此,我在应用程序中使用UI路由器,并使用Angularjs 如何在ui路由器中通知状态更改取消?,angularjs,angular-ui-router,angular-ui,Angularjs,Angular Ui Router,Angular Ui,因此,我在应用程序中使用UI路由器,并使用$stateChangeStart侦听器显示加载程序,然后使用$stateChangeSuccess隐藏加载程序。这样,在状态转换之间就有了一个加载器 $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) { ///show loader }); $rootScope.$on('$sta
$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
为B调用,显示我的加载程序$stateChangeSuccess
,并且从未隐藏我的加载程序(因为我们已经在A中,所以不会重新加载)创造新的 到目前为止,我找到的唯一可持续解决方案是避免使用
ui-sref
。它屏蔽了$state.go
的返回值,该值在本例中是键
诀窍是处理由$state.go返回的转换
承诺
$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的返回值
如果在解决B
之前选择状态A
,则转换
对B
的承诺将被拒绝,原因是错误:转换被取代
。但是,您仍需要等待,直到B.resolve
完成。如果要避免这种情况,您必须自己跟踪您的状态,因为到A
的转换将立即得到解决(因为当前状态仍然是A
,而B
正在尝试解决)
更新的您可以通过在服务中维护状态更改信息轻松实现这一点…@entre但我不知道何时发生了取消。第一个Google结果是否有问题-?您是否阅读了我的问题@PavelHoralI也有同样的问题,在同样的情况下。我打开了一个带有ui路由器项目的应用程序。