Угловая загрузка данных 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, но уверен, что есть гораздо более элегантное решение