0

次の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のメンバー関数として表示されないことを示唆するエラーメッセージを理解することすらできません。 window.file_storeがFileStoreオブジェクトとして認識されている場合でも、file_store。それは私には意味がないので、解釈は間違っていると思います。どんな啓蒙も大歓迎です。

それ以来、私は次のことを試しました。

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.

ここでやりたいのは、起動時に特定のディレクトリが存在することを確認し(1つを除いてすべて削除しました)、将来使用するためにディレクトリオブジェクトを保存し、すべての初期化が完了した後にそれを取得して使用することです。グローバル名前空間のすべてが必要です。もちろん、必要に応じて特定のインスタンスを使用できるようにしたいと思います。理解に問題があることを示しているため、そのように機能させることができないので不安ですが、これを実現することすらできません。単一のグローバルなもので動作します。これはJavascriptの問題ですか、それともPhonegapの問題ですか?

4

2 に答える 2

1

現状では、getDirectory関数はFileStore内のプライベート関数です。FileStoreの「メンバー」または「プロパティ」にしたい場合は、FileStore内で少し変更して次のようにする必要があります。

 this.getDirectory = function(dir){ };

または、そのままにしてからプロパティを設定します。

this.getDirectory = getDirectory();

このように、新しいFileStoreが呼び出されると、プロパティとしてgetDirectoryが設定されます。これは、「new」を使用して関数を呼び出すと、「this」キーワードが常に返されるためです。

この簡単な答えがお役に立てば幸いです。グーグルにはコンストラクター関数に関するものがたくさんあります。

于 2012-07-03T07:26:47.470 に答える
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 での使用中にまだ問題がある場合は、コメントしてください。

于 2012-07-03T08:16:02.423 に答える