2016-08-26 5 views
0

以下のコードTizen Webアプリケーションは、ウェアラブル:TypeMismatchError

var fileHandler = { 
    storages:null, 
    documentsDIR:null, 
    newFile:null, 
    dirName:"documents", 
    fileName:"test.csv", 
    init: function init(){ 
     //tizen.filesystem.listStorages(this.checkCorruptedRemovableDrives);documents 
     tizen.filesystem.resolve(this.dirName, this.resolveSuccessCB,this.resolveErrorCB,"rw"); 

    }, 

    resolveSuccessCB: function resolveSuccessCB(result){ 
     this.documentsDir = result; 
     //this.newFile = documentsDir.createFile(this.fileName); 
     // Error Here - TypeMismatchError: Value is not Object 
     result.listFiles(this.listFilesSuccessCB); 
     console.log("All Good in "+this.documentsDir); 
    }, 

    resolveErrorCB: function resolveErrorCB(error){ 
     console.log("Unable to access "+this.dirName+". Error:"+error.message); 
    }, 

    listFilesSuccessCB: function listFilesSuccessCB(files){ 
     for (var i = 0; i < files.length; i++){ 
      /* Display the file name and URI */ 
      console.log("File name is " + files[i].name + ", URI is " + files[i].toURI()); 
     } 
    }, 



    onStorage: function onStorage(storage){ 
      console.log("Storage found:" + storage.label); 
    }, 
    checkCorruptedRemovableDrives: function checkCorruptedRemovableDrives(storages){ 
     this.storages = storages; 
     for (var i = 0; i < storages.length; i++) 
     { 
      if (storages[i].type != "EXTERNAL"){ 
       continue; 
      } 
      if (storages[i].state == "UNMOUNTABLE"){ 
       console.log("External drive " + storages[i].label + " is corrupted."); 
      } else { 
       console.log(" Storage = " + storages[i].label); 
       // Error here - TypeMismatchError: Value is not Object 
       tizen.filesystem.getStorage(storages[i].label, this.onStorage); 
      } 
     } 
    } 

}でTypeMismatchError: Value is not Objectを取得します。

エラーはエラー2つの場所で発生します。ここではのコードになります。

tizen.filesystem.getStorage(storages[i].label, this.onStorage);では、最初の引数のデータ型はDOMStringであり、storages[i].labelもDOMString型です。 の場合result.listFiles(this.listFilesSuccessCB);はコールバック機能を必要とします。

コードのほとんどはTizen FileSystem Guideから貼り付けられてコピーされていますが、まだ動作していません。

助けてください。少し早いですがお礼を!! また、私がウェアラブルデバイスのファイルシステムを閲覧するとき、 "documents"ディレクトリはどこにありますか?

+0

詳細コードを教えてください。 –

答えて

1

単純な答え変更thisfileHandlerをします。

tizen APIで関数が呼び出されたときに "this"を信頼しないでください。

を使用して、tizen.filesystem.listStoragesのコールバックに繋がっているようです。

checkCorruptedRemovableDrivesの "this"はfileHandlerです。

しかし、ほとんどのTizen Web APIコールバック関数は、次のコードのように呼び出されます。適用の

callback.apply(callback, [].slice.call(arguments, 1)); 

最初の引数はthisためcallbackに渡されるが、それは、自己の関数オブジェクトです。

したがって、関数にfileHandlerが必要な場合は、thisをfileHandler directを使用しないでください。

次のコードはTizen web API実装ですcallIfPossibleの後にthisと表示されます。

function listStorages() { 
    xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.FILESYSTEM_READ); 
    var args = validator_.validateArgs(arguments, [ 
    {name: 'onsuccess', type: types_.FUNCTION}, 
    {name: 'onerror', type: types_.FUNCTION, optional: true, nullable: true} 
    ]); 

    setTimeout(function() { 
    var storages = []; 
    var cache = commonFS_.getAllStorages(); 
    for (var i = 0; i < cache.length; ++i) { 
     storages.push(new FileSystemStorage(cache[i])); 
    } 

    native_.callIfPossible(args.onsuccess, storages); 
    }, 0); 
}; 

https://review.tizen.org/git/?p=platform/core/api/webapi-plugins.git;a=blob;f=src/filesystem/js/file_system_manager.js;h=622f38d479647584012925773d124d7f9a59e51d;hb=refs/heads/tizen#l158

NativeManager.prototype.callIfPossible = function(callback) { 
    if (!_type.isNullOrUndefined(callback)) { 
    callback.apply(callback, [].slice.call(arguments, 1)); 
    } 
}; 

https://review.tizen.org/git/?p=platform/core/api/webapi-plugins.git;a=blob;f=src/utils/utils_api.js;h=5502e3f2a46254c7e2da9d838bacd55be9aaab20;hb=refs/heads/tizen#l1141

+0

素敵な説明をありがとう。私はそれを理解していた。答えにはコメントがありました。 –

0

Tizen IDEオンラインサンプルアプリケーションからヘルプを得ることができます。 あなたはTizen Web AppのFile Manager Appによって助けられます。

そして、TizenのFilesystem APIをチェックしてください。

  • ゴー
  • オンラインサンプル
  • 検索ファイルマネージャ

デモ新しいWebプロジェクトに、ファイルマネージャオンラインサンプルを取得するには、次の enter image description here

+0

私はウェアラブルデバイスで仕事を実行しようとしています。Samsung Gear S2 classic。エミュレータでも動作しません。私はWearablesのFileSystem APIを使いました。上記のコードは90%のコピー貼り付けフォームですFileSystem Guideはここにあります:https://developer.tizen.org/ko/development/tutorials/web-application/tizen-features/base/filesystem?langredirect = 1 まだ私は上記のサンプルアプリケーションを試してみます。それが助けてくれることを願って。 –

+0

APIはほぼ同じだと思います。これを使用してヘルプを得ることができます。 –

+0

私は解決策を見つけましたが、その理由は何か分かりません。 エラーが発生した場所で、 'this.functionName'を使用してそれらの関数を呼び出します。エラーは' this'の使用によるものです。いったん 'この' kewordを取り除き、 'fileHandler'でそれらを置き換えると、うまくいきました。私は非常にjavascriptに自信がないので、私はそのような動作の理由を主張することはできませんが、まだ私はjavaやCのように静的コンテキストを使用していると思います。 –

関連する問題