Javascript对象成员函数引用全局在回调中无法识别

时间:2012-07-03 07:05:05

标签: javascript cordova

我遇到以下Javascript代码问题(Eclipse中的Phonegap):

function FileStore(onsuccess, onfail){
    //chain of Phonegap File API handlers to get certain directories

    function onGetSupportDirectorySuccess(dir){
        //stuff
        onsuccess();
    }

    function getDirectory(dir){
        return "something" + dir; 
    }
}

var onFileStoreOpened = function(){
    if (window.file_store instanceof FileStore){
      console.log('window.file_store is a FileStore');
      console.log(window.file_store.getDirectory('something'));
    }
}

var onDeviceReady = function(){
  window.file_store = new FileStore(onFileStoreOpened, onFileStoreFailure);  
}

在这里,我想做一些事情来初始化应用程序的文件服务,然后在我的回调初始化中使用它们。我在LogCat中收到以下错误消息:

07-03 06:26:54.942: D/CordovaLog(223): file:///android_asset/www/index.html: Line 40 : window.file_store is a FileStore
07-03 06:26:55.053: D/CordovaLog(223): file:///android_asset/www/cordova-1.8.1.js: Line 254 : Error in success callback: File7 = TypeError: Result of expression 'window.file_store.getDirectory' [undefined] is not a function.

移动代码并删除getDirectory()中的所有内容以确保它有效后,我甚至不确定我是否理解错误消息,这告诉我getDirectory()不被视为成员函数window.file_store,即使window.file_store被识别为FileStore对象。这对我没有意义,所以我猜这种解释是不正确的。任何启蒙都将受到高度赞赏。

我已经尝试了以下内容:

window.file_store = {
    app_data_dir : null,
    Init: function(onsuccess, onfail){
        //chain of Phonegap File API handlers to get directories
        function onGetSupportDirectorySuccess(dir){
            window.file_store.app_data_dir = dir;
            console.log("opened dir " + dir.name);
            onsuccess();
        }
    },

    GetDirectory : function(){
        return window.file_store.app_data_dir; //simplified
    }
}


var onFileStoreOpened = function(){
    var docs = window.file_store.getDirectory();
    console.log('APPDATA: ' + docs.fullPath);
}

var onDeviceReady = function() {
    window.file_store.Init(onFileStoreOpened, onFileStoreFailure);  
}

我得到了

D/CordovaLog(224): file:///android_asset/www/base/device.js: Line 81 : opened dir AppData
D/CordovaLog(224): file:///android_asset/www/cordova-1.8.1.js: Line 254 : Error in success callback: File7 = TypeError: Result of expression 'docs' [null] is not an object.

我想在这里做的就是确保某些目录存在(我已经删除了除了一个之外的所有目录),保存目录对象以备将来使用,然后在所有初始化完成后检索并使用它,然后我不希望全局命名空间中的所有内容。当然我希望能够在必要时使用特定的实例,我很不安,因为它表明我的理解存在问题,但我无法让它工作,但是我甚至无法理解使用单一的全球性工作。这是一个Javascript问题还是Phonegap问题?

2 个答案:

答案 0 :(得分:1)

目前,您的getDirectory函数是FileStore中的私有函数。如果你想把它变成FileStore的'成员'或'属性',你需要在FileStore中稍微修改它,使它像这样:

 this.getDirectory = function(dir){ };

或保留原样,然后设置属性....

this.getDirectory = getDirectory();

这样当调用新的FileStore时,它会将getDirectory作为属性,因为在调用带有'new'的函数时总会返回'this'关键字

希望这个快速回答有所帮助。关于构造函数的goog上有很多东西。

答案 1 :(得分:1)

你理解正确。它所代表的getDirectory是一个私有函数,不能使用file_store实例调用。

在浏览器中尝试此操作。

function FileStore(onsuccess, onfail){
   function onGetSupportDirectorySuccess(dir){
        //stuff
        onsuccess();
   }

   this.getDirectory = function (dir){
   return "something" + dir; 
   }
}

window.file_store = new FileStore('', '');  //the empty strings are just placeholders.
if (window.file_store instanceof FileStore){
    console.log('window.file_store is a FileStore');
    console.log(window.file_store.getDirectory('something'));
}

这将证明基本的js代码工作正常。如果在PhoneGap中使用它时仍然存在问题,请发表评论。