Angularjs 如何在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

因此,我在应用程序中使用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
});
问题:

  • 我处于A状态
  • 我点击一个按钮进入状态B,
    $stateChangeStart
    为B调用,显示我的加载程序
  • 我立即点击另一个按钮进入状态A(B有一些问题需要解决,所以在B的UI实际开始加载之前还有一段时间)
  • 未加载B,并且未调用
    $stateChangeSuccess
    ,并且从未隐藏我的加载程序(因为我们已经在A中,所以不会重新加载)
  • 那么,有没有一种方法可以监听状态更改取消并隐藏我的加载程序

    更新: 我创建了一个。在plunk中,我在B的解析中给出了10秒的超时时间。因此,在解析之前,请单击A。监视控制台中的状态更改侦听器事件

    使用最新AngularUI路由器的2015年7月25日更新:
    创造新的

    到目前为止,我找到的唯一可持续解决方案是避免使用
    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路由器项目的应用程序。