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

从Cordova设备就绪事件手动引导AngularJS

墨高杰
2023-03-14
问题内容

我正在使用Cordova 3.3.1-0.4.2和Angular 1.2.13

收到Cordova“ deviceready”事件后,我需要手动引导Angular。

我正在Nexus 5上进行测试,cordova run android但在iPhone上却具有完全相同的行为。

为了简化问题,这是JS在全局文档范围内运行。脚本在结束</body>标记之前加载。

这有效:

angular.bootstrap(document.getElementById("app"), ["MyApp"]);

这不起作用:

function init(){
  angular.bootstrap(document.getElementById("app"), ["MyApp"]);
}

document.addEventListener('deviceready', function () {
  init();
}, true);

但是,如果我添加alert("init")到显示它正在运行的init方法中。同时alert(angle)和alert(document.getElementById(“
app”))表示它们存在。

我不明白为什么,由于调用了init(),因此从EventListener回调中调用它时不起作用,但是如果直接调用它,则它确实起作用。

看起来很奇怪/直觉。

任何人?


问题答案:

我发现的最佳解决方案是正常启动Angular,然后将Cordova作为返回Promise的模块加载,在设备准备就绪时解决。

angular.module('fsCordova', [])
.service('CordovaService', ['$document', '$timeout', '$window',  '$q',
  function($document, $timeout, $window, $q) {

    var defer = $q.defer();

    this.ready = defer.promise;

    // Backup in the case that we did not received the event
    // This seemed to be necessary with some versions of Cordova
    // when testing via 'cordova serve' in a web browser
    // but when on-device the event is received correctly
    var timoutPromise = $timeout(function() {
      if ($window.cordova){
        defer.resolve($window.cordova);
      } else {
        defer.reject("Cordova failed to load");
      }     
    }, 1200);

    angular.element($document)[0].addEventListener('deviceready', function() {
      $timeout.cancel(timoutPromise);
      defer.resolve($window.cordova);
    });  
  }
]);

用法:

angular.module('app', ['fsCordova']).

run(['$window', function($window){
  // init Fastclick
  FastClick.attach(angular.element($window.document.body)[0]);
}]).

controller('AppCtrl', ['$scope', 'CordovaService', 
  function($scope, CordovaService){

    $scope.ready = false;

    // when cordova is ready
    CordovaService.ready.then(
      function resolved(resp) {
         $scope.ready = true;  
      },
      function rejected(resp){
        throw new Error(resp);
      }
    );
  }
]);

我在GitHub上分享了这个引导项目



 类似资料:
  • 问题内容: 我正在使用Cordova和AngularJS开发移动应用程序。在准备好Cordova设备之前,如何限制AngluarJS的引导。基本上,我不想在设备准备就绪之前使用任何AngularJS控制器。 问题答案: 手动引导您的Angular应用程序: 从HTML代码中删除属性,因此Angular不会自行启动。 在您的JavaScript代码中添加以下内容: 有关引导应用程序的角度文档。

  • 我正在使用jQuery Mobile,我无法理解经典文档就绪和jQuery Mobile页面事件之间的差异。 > 真正的区别是什么? 为什么应该 比更好 当您从一个页面转换到另一个页面时,页面事件的顺序是什么? 如何将数据从一个页面发送到另一个页面,是否可以访问上一个页面的数据?

  • 现在,我注意到具有,但是events列表中的最后一个事件将状态列为,因为准备状态探测失败。(在应用程序日志中,我可以看到,自那以后,有更多的请求传入准备状态探测,并且它们都成功了。) 我应该如何解释这些信息?Kubernetes认为我的豆荚准备好了,还是没有准备好?

  • 我无法创建某个docker容器,因为jenkins告诉我该名称已在使用中。 我已尝试查找或删除此容器,但无法执行以下操作: 容器是通过jenkins构建的,在不同的构建中,总是有相同的容器id在使用中被否认。我们有八个不同的jenkins节点,这项工作在其中七个节点上工作,创建和删除具有该名称的docker图像。 如何移除这个“幽灵”容器?Allready尝试了但没有成功:

  • 我遇到了一个问题: 获取健康检查以成功。尝试使用容器本机负载平衡(CNLB)时,在IIS容器中运行的Net app。 我有一个网络endpoint组(NEG),由GKE中的入口资源定义和VPC本机集群创建。 当我通过公开NodePort或制作LoadBalancer类型的服务来规避CNLB时,站点会毫无问题地解决。 所有的吊舱条件从一个描述看起来不错:吊舱准备就绪 运行时会显示网络endpoint

  • 智能手机和平板电脑的普及,为用户与浏览器交互引入了一种新的方式,而一类新事件也应运而生。 设备事件(device event)可以让开发人员确定用户在怎样使用设备。W3C 从2011 年开始着手制定一份关于设备事件的新草案(http://dev.w3.org/geo/api/spec-source-orientation.html),以涵盖不断增长的设备类型并为它们定义相关的事件。本节会同时讨论这