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

标签 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 问题?

最佳答案

就目前情况而言,您的 getDirectory 函数是 FileStore 中的私有(private)函数。如果您想让它成为 FileStore 的“成员”或“属性”,您需要在 FileStore 中对其进行一些更改,使其如下所示:

 this.getDirectory = function(dir){ };

或者保持原样,然后设置一个属性......

this.getDirectory = getDirectory();

这样,当调用 new FileStore 时,它​​将具有 getDirectory 作为属性,因为使用“new”调用函数时始终返回“this”关键字

希望这个快速回答能有所帮助。谷歌上有很多关于构造函数的内容。

关于回调中全局引用的 Javascript 对象成员函数无法识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11306017/

相关文章:

javascript - 如何在 jQuery 中将整数值增加 1

javascript - 网格图像 HTML

javascript - PhoneGap : include files without javascript

javascript - 从循环或条件中更新变量

javascript - 如何将函数的结果设置为全局变量

javascript - 在knockout.js中编写组合条件以与click一起使用

jquery - 检测两个不同元素的触摸

jquery - Angular 将页面转换为可下载或通过电子邮件发送的 html

javascript - 布局、Phonegap 和 JSON

iphone - 从phonegap打开 native map 应用程序