2

我有一个使用 Angular 和 JS-Data 的离子应用程序,在移动设备上运行时应该从下载的 JSON 文件中加载数据。

我将文件与应用程序捆绑在 www 文件夹中,并根据设备的类型复制到相关的存储文件夹中。复制文件后,如果有 Internet 连接,应用程序会尝试从 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 (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 回答