Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
回调中全局引用的Javascript对象成员函数无法识别_Javascript_Cordova - Fatal编程技术网

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

回调中全局引用的Javascript对象成员函数无法识别,javascript,cordova,Javascript,Cordova,我对以下Javascript代码(Eclipse中的Phonegap)有问题: 在这里,我想做一些事情来初始化应用程序的文件服务,然后在回调初始化中使用它们。我在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

我对以下Javascript代码(Eclipse中的Phonegap)有问题:

在这里,我想做一些事情来初始化应用程序的文件服务,然后在回调初始化中使用它们。我在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中的私有函数。如果要使其成为FileStore的“成员”或“属性”,则需要在FileStore中对其稍作修改,使其如下所示:

 this.getDirectory = function(dir){ };
或者让它保持原样,然后设置一个属性

this.getDirectory = getDirectory();
这样,当调用new FileStore时,它将以getDirectory作为属性,因为在调用具有“new”的函数时始终返回“this”关键字


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

你理解得对。当前的getDirectory是一个私有函数,不能使用文件存储实例调用

在浏览器中试试这个

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中使用它时仍然存在问题,请发表评论。

我尝试了这两种变体,但都没有效果。我得到了完全相同的错误。我确保我也清理了这个项目,只是为了确保。这是我的第一个大型JS项目,显然我还有很多东西要学习,以便了解对象模型。无论如何谢谢你!这篇文章确实提醒了我,在公共/私人问题上有很多工作要做。我忘了所有这些功能都不是公共的。我刚刚尝试将函数移出构造函数,并使用FileStore.prototype.getDirectory=function(dir)作为前缀,但是“new FileStore()”完全失败。是的,这是可行的,但是如果您将if语句移动到一个新函数“onSuccess”并将其传递给构造函数,在构造函数调用onGetSupportDirectorySuccess()中,调用onSuccess时,window.file_存储不再是FileStore的实例。这种桌面Chrome的行为对我来说(主要来自C++)比文件存储作为文件存储的实例更有意义,但在Android的情况下则不然。有一个示例说明如何异步完成每个步骤。下一步作为回调传递给上一步。您的日志语句声明app_data_dir有一些值,但下一个日志语句说它为null。。。你可以把整个(简化的基本)代码作为要点或其他什么发布吗?在不知道谁在调用什么的情况下,很难诊断这一点。我不确定我是否在第二次尝试某种方法时用编辑更改了基本问题,因为我最终得到了一个不同的错误,但在我看来,基本问题是关于如何使用JS对象模型进行初始化,初始化完成后执行回调,然后访问已完成的工作。我希望我可以更改标题以使其更清楚。特别是,如何进行异步初始化。
var docs=window.file\u store.getDirectory()
应该有
GetDirectory
,即大写的G。我假设在编辑问题时这是一个打字错误。
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'));
}