如何了解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
});

问题:

  • 我处于A状态
  • 我点击一个按钮进入状态B,为B调用$stateChangeStart ,显示我的加载器。
  • 立即我点击另一个按钮进入状态A(B有一些东西可以解决,所以在B的UI实际开始加载之前有时间)
  • B没有加载,并且$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

    上一篇: How to be informed of state change cancellations in ui

    下一篇: Android emulator in Docker