Угловая загрузка данных JS-Data из локального файла

У меня есть ионное приложение, использующее Angular и JS-Data, которое при запуске на мобильном устройстве должно загружать данные из загруженных файлов JSON.

Я связываю файлы с приложением в папке www и копирую в соответствующую папку хранения в зависимости от типа устройства. После того, как файлы были скопированы, если есть подключение к Интернету, приложение пытается получить самые последние данные из CDN, сохранить новые данные в файлах JSON и считывает новые данные из файлов JSON в JS-Data, чтобы пользователю показываются новые данные.

Это все работает, кроме бита после того, как файлы сохранены и пользователю показаны новые данные, им показаны старые кэшированные данные. Выход данных перед сохранением в файл показывает правильные данные, а загрузка файла с использованием $ cordovaFile показывает правильные данные, правильный путь к файлам и вся отладка указывает на правильную выборку данных JS-Data во второй раз.

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 (области) показывает старые данные из файла, но с использованием точного кода выше, если я изменю переменную basePath на ссылку, которая получила новые удаленные данные, тогда console.log (области) покажет новые обновленные данные.
Есть идеи, что я делаю неправильно, что я не обхожу кеш?

1 ответ

До сих пор лучший способ, который я нашел, чтобы решить это, это вызвать getData из состояния разрешения,

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

getData первоначально запустил функцию backgroundUpdate по завершении, так как есть другой маршрутизатор для зарегистрированных представлений, я удалил backgroundUpdate из функции getData и добавил к разрешенному маршрутизатору, как показано ниже

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

Это единственный способ, который я обнаружил, который фактически показывает новые данные в файле console.log в loadData, но уверен, что есть гораздо более элегантное решение

Другие вопросы по тегам