【问题标题】:Cordova 'deviceready' event not firing from within angular .run blockCordova 'deviceready' 事件未从角度 .run 块内触发
【发布时间】:2013-12-19 21:39:23
【问题描述】:

我在从 AngularJS 内部注册“设备就绪”时遇到问题。我确定这之前可以正常工作,所以我不确定发生了什么变化。

如果我从全局 addEventListener 调用“deviceready”,它会像这样工作:

document.addEventListener('deviceready', function(){
   localStorage.deviceReadyGlobal = true;
});

deviceReadyGlobal=true 已设置。但是,如果我尝试从 Angular 中附加它,它永远不会触发,如下所示:

app.run(function(){
    document.addEventListener('deviceready', function(){
        localStorage.deviceReadyAngular = true;
    });
});

deviceReadyAngular 永远不会被设置。现在,我知道 PhoneGap 可能已经在 Angular 引导时触发了“deviceready”,但根据 PhoneGap 文档,这应该没关系。

deviceready 事件的行为与其他事件有些不同。任何 在 deviceready 事件触发后注册的事件处理程序有它的 回调函数立即调用。

'deviceready' 的行为是否发生了变化?

我目前使用的是 Cordova 3.3.0 和 Angular 1.2.5。

【问题讨论】:

  • 不知道为什么它不工作,但我总是在 deviceReady 处理程序中引导角度。
  • 谢谢。我知道很多 PhoneGap/Angular 的人都推荐这种方法。我试图避免它,因为我们的应用引导程序中没有任何阻塞的 PhoneGap 依赖项。我们也不会/总是/在 PhoneGap 中运行应用程序。
  • 我打赌你错过了 deviceready 事件,因为附加你的处理程序太晚了。您是否尝试过在角度开始之前使用全局捕获它,然后仅在您尚未看到该事件时才将事件添加到您的 run 块中?
  • @JeffHubbard cordova.js 劫持 document.addEventListener 并对其进行修改,以便在它已经触发一次后尝试附加“deviceready”时立即执行回调函数。因此,它应该正确处理这种情况。我想我有一个部分答案 - 我稍后会写出来。谢谢!
  • @sandstrom 不完全是。我似乎有两个问题。如果我使用 on(),那么 PhoneGap 和 Angular 似乎与他们的事件处理程序劫持发生冲突。如果我使用 addEventListener(),看起来 Angular 在加载 cordova.js 之前正在执行。无论哪种方式,它都是善变的,我最终将该代码移出 Angular。我现在只是在它自己的全局命名空间中运行它。

标签: javascript angularjs cordova


【解决方案1】:

这就是我在应用程序中的操作方式;

// Create an application module with dependencies
var app = angular.module('myApp', []);

function loadTheApp() {

    // Hide splash screen if any
    if (navigator && navigator.splashscreen) {
        navigator.splashscreen.hide();
    }

    // Initiate FastClick
    FastClick.attach(document.body);

    // Boot AngularJS
    try {
        angular.bootstrap(document, ['myApp']);
    } catch (e) {
        console.log('errrrrrrrrrrrrrr! ' + e);
    }
}

// Listen to device ready
angular.element(document).ready(function() {
    if (window.cordova) {
        document.addEventListener('deviceready', loadTheApp, false);
    } else {
        loadTheApp();
    }
});

这样,如果我们在设备环境中,那么我们会监听 deviceready 事件,如果不是,那么我们就忽略该事件并加载我们的应用程序。

【讨论】:

    【解决方案2】:

    无论哪种方式,您都可以使用 DOMContentLoaded 事件处理程序以 javascript 方式处理它

    document.addEventListener("DOMContentLoaded", function() {
        //alert("Calling DOMContentLoaded");
        document.addEventListener('deviceready', function(){
            //alert("Calling onDeviceReady()");
            initializeYourApp();
        }, false);
    });
    

    【讨论】:

      【解决方案3】:

      我遇到过这个问题。对我来说,问题在于标题中有 for cordova.js 。

      如果您从 cordova cli 生成示例项目,它们的主体内有 script 标签。

      一旦我把它放在正文中,就像示例项目一样,在 app-root 旁边,我开始获取 deviceready 事件

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-28
        • 2015-09-20
        • 2019-01-31
        • 2015-12-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多