2

モバイルデバイスで実行すると、ダウンロードしたJSONファイルからデータをロードする必要があるangularおよびJS-Dataを使用するイオンアプリがあります。

アプリでファイルを www フォルダーにまとめて、デバイスの種類に応じて該当する保存フォルダーにコピーしています。ファイルがコピーされると、インターネット接続がある場合、アプリは CDN から最新のデータを取得しようとし、新しいデータを JSON ファイルに保存し、新しいデータを JSON ファイルから JS-Data に読み込みます。ユーザーには新しいデータが表示されます。

これは、ファイルが保存され、ユーザーに新しいデータが表示された後のビットを除いてすべて機能し、古いキャッシュされたデータが表示されます。ファイルに保存する前にデータをログアウトすると正しいデータが表示され、$cordovaFile を使用してファイルをロードすると正しいデータが表示されます。ファイルへのパスは正しく、すべてのデバッグは JS-Data を指しており、2 回目にデータを正しく取得しています。

appData
    .loadData (basePath)
    .then (() => {
        assetsFactory
            .backgroundUpdate ()
            .then (basePath => appData.loadData (basePath, true))
    })

ここで、basePath はファイルが保存されているフォルダーへの絶対リンクであり、次に loadData 関数で

appData.loadData = (basePath, bypassCache) => $q ((resolve, reject) => {
    if (bypassCache === undefined) {
        bypassCache = false
    }

    let options = {
        basePath,
        bypassCache,
        cacheResponse : true,
    }
    ....
    Area.findAll ({}, options)
        .then (areas => {
            console.log (areas)
        })
   ....
})

console.log (areas) はファイルからの古いデータを表示しますが、上記の正確なコードを使用して、basePath 変数を新しいリモート データを取得したリンクに変更すると、console.log (areas) は新しく更新されたデータを表示します。
キャッシュをバイパスしていないという私が間違っていることについて何か考えはありますか?

4

1 に答える 1

0

これまでのところ、これを解決するために見つけた最善の方法は、状態解決から getData を呼び出すことです。

$stateProvider.state ('app', {
    ...
    resolve : {
         load : (appFactory) => appFactory.getData ()
    }
})

getData は元々、完了時に backgroundUpdate 関数をトリガーしました。ログイン ビュー用の別のルーターがあるため、getData 関数から backgroundUpdate を削除し、以下のようにログイン ルーターの解決に追加しました。

 $stateProvider.state ('app.home', {
    url : '/home',
    abstract : true,
    controller : 'HomeController as _home',
    templateUrl : homeTemplate,
    data : {
        role : USER_ROLES.user,
    },
    resolve : {
        load : (appFactory) => appFactory.backgroundRefresh (),
    },
})

これは、loadData の console.log に実際に新しいデータを表示することがわかった唯一の方法ですが、もっと洗練された解決策があることは確かです

于 2016-04-22T09:20:39.890 に答える