【问题标题】:Angular default $http cache removes after route changeAngular 默认 $http 缓存在路由更改后删除
【发布时间】:2016-08-08 06:50:52
【问题描述】:

我在我的一项服务中使用 Angular 的默认 $http 缓存。当用户从一个视图导航到另一个视图时(我使用的是ui-router),缓存失效并且所有的项目都将被删除。我不想在我的应用程序的整个生命周期中使缓存无效。

编辑: 例如,这个工厂导航到另一个路由后不返回缓存结果,而是调用服务端api获取结果:

cardModule.factory("myFactory", function ($http) {
    return {
        getAll: function () {
            return $http.get("all", { cache: true })
        }
    }
});

如何防止默认缓存在路由更改后从自身中删除项目?

【问题讨论】:

  • 能否提供 JSBin 或 plunkr 代码示例?
  • 困惑。服务中的缓存将持续存在。如果您再次调用该服务,则会提供缓存而不是新的调用。

标签: angularjs angular-ui-router angular-cache


【解决方案1】:

这不应与ui-router$http 相关。您需要确认以下几点:

  1. 您的服务器(为您的资源提供服务)是否正在设置缓存标头
  2. 确保您没有使用Ctrl + F5 刷新页面
  3. 如果您使用的是 Chrome 浏览器,请确保未选中设置 Disable cache

【讨论】:

  • 我不刷新页面,我只是导航到另一个视图。该问题与http协议缓存无关。是angular的$http缓存的问题。
【解决方案2】:

我会将此作为评论,但我还没有足够的积分..

你能尝试某种形式的记忆吗?换句话说,在作用域上有一个模型,那么,如果模型未定义,触发 $http 调用?比如:

var ctrl = this;

ctrl.product = undefined; // or null

if (ctrl.product === undefined) { // or null
  $http.get(...).then(function(resp) {
     ctrl.product = resp.data;
  };
};

这样模型就被初始化了,并且只被调用了一次。一个可能的缺点是 if 语句可能会降低效率。

我没有测试过这个,只是把这个想法扔在那里。我对这个问题也很感兴趣。

【讨论】:

  • 是的,我可以。但是 Angular 有一个很好的开箱即用的缓存机制,我想使用它的最佳实践。我也可以编写自己的 cacheProvider 但我认为 angular 的默认缓存功能可以解决问题。
  • 太棒了!你比我先进很多^^我会做更多的研究并密切关注这个问题。
  • NG-Book 建议使用类似var cache = $cacheFactory.get('$http'); var usersCache = cache.get('http://example.com/api/users.json'); 的方式来操作默认的 $cache。这可能比编写自定义的要短。
【解决方案3】:

我找到了问题的根源。这是我自己的错。我在某处有一个代码可以在状态更改后清除缓存。默认角度 $http 缓存没有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2010-11-28
    • 2012-03-17
    • 1970-01-01
    • 2020-01-15
    • 2019-07-21
    相关资源
    最近更新 更多