angularjs – ui-router resolve在Ionic中表现奇怪

前端之家收集整理的这篇文章主要介绍了angularjs – ui-router resolve在Ionic中表现奇怪前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我从一个演示离子应用程序(离子启动myApp sidemenu)开始,and added a resolve to one of the views
resolve: {
  issue: function($q,$timeout) {
    var defer = $q.defer();
    //defer.reject();       // Doesn't work browser or device
    $timeout(defer.reject); // Works in browser,but not device
    return defer.promise;
  }
}

我在这里监视被拒绝的决议:

.run(function($ionicPlatform,$rootScope,$ionicLoading) {
  $ionicPlatform.ready(function() {
    // regular stuff here

    $rootScope.$on('$stateChangeError',function() {
      $ionicLoading.show({
        template: 'All good!'
      });
    });
  });
});

出于某种原因,如果resolve立即拒绝(参见上面的defer.reject()),则不会运行$stateChangeError的回调.如果我做的完全相同,但在Ionic之外,it works!

此外,尝试通过$timeout(defer.reject)来延迟解析拒绝;导致不同的行为.现在它按预期在浏览器中工作,但仍然无法在设备上运行.试图延迟更多,导致设备成功:

$timeout(function() {
  defer.reject();
},250); // Doesn't work for me with 200 or less

任何人都可以阐明这一点吗?

SEE HERE HOW TO REPRODUCE THE ISSUE

根据我对Angular和promise模型的经验.为了解决/拒绝一个承诺,Angular必须勾选JS事件循环的一个循环 – nextTick – 这可以使用$scope.apply()完成,这就是我们在单元测试中模拟这些东西的方法.

这是一个很棒的article,讨论$timeout和$scope.$evalAsync – 从我可以收集到的$timeout正在评估下一个tick中的函数.这个代码按照您概述的方式工作的原因是什么.

resolve: {
  issue: function($q,$timeout) {
    var defer = $q.defer();
    //defer.reject();       // <---- no nextTick
    $timeout(defer.reject); // <---- $timeout evaluates on nextTick
    return defer.promise;
  }
}

这是另一个article,讨论了$q的textTick实现.

我知道这不能解决你的问题 – 但它应该说明为什么会这样!祝你好运!

原文链接:https://www.f2er.com/angularjs/142385.html

猜你在找的Angularjs相关文章