当前位置: 首页 > 面试题库 >

ui路由器解析在Ionic中表现异常

别锐
2023-03-14
问题内容

我从一个演示程序离子(开始ionic start myApp sidemenu),并添加一个resolve到一个视图:

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;
  }
}

resolve在这里监视被拒绝的s:

.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之外,那行得通!

而且,尝试resolve通过这样做来延迟拒绝会$timeout(defer.reject);导致不同的行为。现在,它可以按预期在浏览器中运行,但仍无法在设备上运行。尝试进一步延迟,将导致设备成功:

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

谁能阐明这一点?

[**SEE HERE HOW TO REPRODUCE THE ISSUE**](https://github.com/moroshko/ResolveIssue)


问题答案:

根据我对Angular和Promise模型的经验。为了解决/拒绝承诺,Angular必须在JS事件循环的一个周期(nextTick)上打钩,这可以使用$
scope.apply()来完成,这是我们在单元测试中模拟此类事情的方式。

这是一篇很棒的文章,谈论$ timeout和$ scope。$ evalAsync-从我可以收集到的信息中,$
timeout正在下一滴答中评估函数。这就是该代码按您概述的方式工作的原因。

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

这是另一篇谈论$
q的textTick实现的文章。

我知道这不能解决您的问题-但应该可以弄清为什么会发生这种情况!祝好运!



 类似资料:
  • 问题内容: 属性的允许在呈现相应视图之前执行一些作业。 如果我想在执行这些作业时显示微调框以增加用户体验怎么办? 确实,否则,用户会感觉到应用程序已被阻止,因为例如在大于600的毫秒内没有显示任何视图元素。 当然,由于该功能,因此可以 从当前视图中定义* 要显示的全局元素,以便显示微调器。 但是我不想只在中间放置一个糟糕的微调器来隐藏整个页面。 我希望Webapp的某些页面在显示加载方式方面有所不

  • 问题内容: 更新 :从开始,这应该在angular-ui- router中是可能的。请参阅发行说明https://github.com/angular-ui/ui- router/releases/tag/1.0.0alpha0 和问题https://github.com/angular-ui/ui- router/issues/1018 I创建。 在解决问题时,我想访问该应用导航到使用角度ui路

  • 问题内容: 因此,请考虑我的angularUI路由设置中的以下片段。我导航到路线/ category / manage / 4 / details(例如)。我希望可以在相关的控制器加载之前解决“类别”问题,实际上是可以在我可以从类别服务返回类别的resolve函数中放置一个断点,并查看类别是否已返回的事实。现在在控制器本身内部放置另一个断点,我可以看到“类别”始终是未定义的。它不是由UI路由器注入

  • 最终编辑:使用transcluded指令处理plunker。 编辑:我用第一个答案中给出的解决方案做了第一次撞击。它可以工作,但这不是期望的行为,因为模板包含所有的部分内容。 我用我希望达到的目标做了第二次尝试(但显然不起作用)。我认为这主要是因为模板不是分部的父级,但它包含在其中,所以ui路由器不太理解我想要什么。 在此方面的任何帮助都将不胜感激! 我们正在建立一个网站与角材料和UI路由器,我们

  • 问题内容: 角度ui路由器的示例演示在起始页面具有以下链接: “ ui-router”的完整网址为或 “关于”的完整网址为或 当我使用durandalJS时,存在一个限制,即默认URL只是“ /”,不能有“ / ui-router”。 Angular ui路由器插件有相同的限制吗? 问题答案: 请参阅此处,默认路由有一个“其他”选项。

  • 问题内容: 我正在尝试测试一些视图,这些视图用于链接到应用程序中的其他状态。在我的测试中,我触发了对此元素的点击,如下所示: 如果状态切换为,该如何测试?在我的控制器中像这样使用时,这很容易: 但是当我使用时,我不知道要监视什么对象。如何验证我的应用程序处于正确状态? 问题答案: 我自己找到的。在查看了角度ui路由器源代码后,我在指令中找到了以下行: 当元素收到点击时,会包装在回调中。因此,在测试