Cordova的“deviceready”事件在angular的.run块中无法触发

6

我遇到了在AngularJS内部无法注册'deviceready'的问题。我确定之前是可以的,所以不确定出了什么问题。

如果我从全局addEventListener中调用'deviceready',就像这样:

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

deviceReadyGlobal=true被设置了。但是,如果我试图在Angular内部附加它,它永远不会触发,就像这样:

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

deviceReadyAngular从未被设置。我知道在Angular引导时,PhoneGap可能已经触发了“deviceready”事件,但根据PhoneGap文档,这不应该有影响。

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

“deviceready”的行为是否有所改变?

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


1
不确定为什么它不起作用,但我一直在deviceReady处理程序中引导angular。 - Jonathan Rowny
谢谢。我知道许多PhoneGap / Angular的人推荐这种方法。我试图避免这种情况,因为我们的应用程序引导程序中没有任何阻止PhoneGap依赖项。我们也不总是在PhoneGap中运行应用程序。 - Jason Farnsworth
1
我敢打赌,你错过了 deviceready 事件,因为你的处理程序附加得太晚了。你是否尝试使用全局变量在 Angular 启动之前捕获它,然后仅在你还没有看到该事件时在你的 run 块中添加事件? - Jeff Hubbard
@JeffHubbard cordova.js劫持了document.addEventListener并修改它,以便在您尝试在“deviceready”已经触发一次后附加它时立即执行回调函数。因此,它应该正确处理这种情况。不过,我认为我有一个部分答案 - 我稍后会写出来。谢谢! - Jason Farnsworth
@JasonFarnsworth 我认为我们有类似的问题,你找到解决方案了吗? - sandstrom
1
@sandstrom 不完全是这样。我似乎遇到了两个问题。如果我使用on(),那么PhoneGap和Angular似乎会在事件处理程序上发生冲突。如果我使用addEventListener(),似乎Angular会在cordova.js加载之前执行。无论哪种方式,都不太稳定,最后我把这段代码从Angular中移出来了。现在我只是在它自己的全局命名空间中运行它。 - Jason Farnsworth
3个回答

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事件,否则我们会忽略该事件并加载我们的应用程序。


0
无论哪种方式,您也可以使用JavaScript的DOMContentLoaded事件处理程序来处理它。
document.addEventListener("DOMContentLoaded", function() {
    //alert("Calling DOMContentLoaded");
    document.addEventListener('deviceready', function(){
        //alert("Calling onDeviceReady()");
        initializeYourApp();
    }, false);
});

0
我曾经遇到过这个问题。对我来说,问题在于将cordova.js的

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接