2013-12-19 67 views
6

我遇到了'deviceready'從AngularJS內部註冊的問題。我確信這是以前的工作,所以我不確定發生了什麼變化。Cordova的'deviceready'事件沒有從angular.run塊內部觸發

如果我稱之爲 'deviceready' 從全球的addEventListener,它的工作原理,就像這樣:

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

deviceReadyGlobal = TRUE時。但是,如果我嘗試從Angular內部添加此內容,它將不會觸發,如下所示:

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

deviceReadyAngular從不設置。現在,據我所知,PhoneGap可能已經啓動了'deviceready',而Angular是bootstrapping,但根據PhoneGap文檔,這應該不重要。

deviceready事件與其他行爲有所不同。在deviceready事件觸發後註冊的任何 事件處理函數立即調用其 回調函數。

'deviceready'的行爲發生了變化嗎?

我目前使用Cordova 3.3.0和Angular 1.2.5。

+1

不知道爲什麼它不工作,但我一直只是在自舉處理deviceReady角。 –

+0

謝謝。我知道很多PhoneGap/Angular人推薦這種方法。我試圖避免它,因爲我們的應用程序引導程序中沒有任何屏蔽PhoneGap依賴項。我們也沒有/總是/在PhoneGap中運行應用程序。 –

+1

我敢打賭,你錯過了'deviceready'事件,因爲你的處理程序太晚了。您是否嘗試過在角度啓動之前使用全局函數來捕獲它,然後僅在您尚未看到事件時纔在「運行」塊中添加事件? –

回答

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

這樣,如果我們的設備environement內,然後我們聽deviceready情況下,如果不是,那麼我們就忽略該事件並加載應用程序。

0

無論哪種方式,你也可以用DOMContentLoaded事件處理程序處理它在JavaScript的方式

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