加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-17 07:33:44 所属栏目:安全 来源:网络整理
导读:我从一个演示离子应用程序(离子启动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); //
我从一个演示离子应用程序(离子启动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实现.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读