Cordova'deviceready'事件没有在角度.run区域内发射

时间:2013-12-19 21:39:24

标签: javascript angularjs cordova

我在让'deviceready'从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可能已经解雇了'deviceready'而Angular正在引导,但根据PhoneGap文档,这应该没关系。

  

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

'deviceready'的行为有什么变化吗?

我目前正在使用Cordova 3.3.0和Angular 1.2.5。

3 个答案:

答案 0 :(得分:5)

这就是我在我的应用程序中执行的操作;

// 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事件,如果没有,那么我们只是忽略该事件并加载我们的应用程序。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我遇到了这个问题。对我来说,问题在于标头中包含for cordova.js。

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

一旦将其放入体内,就像示例项目中那样,在应用程序根目录旁边,我就开始获取deviceready事件