首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在AngularJS中刷新/使$resource缓存无效

如何在AngularJS中刷新/使$resource缓存无效
EN

Stack Overflow用户
提问于 2013-06-12 15:08:08
回答 3查看 60K关注 0票数 96

我有一个使用默认$http缓存实现的简单用户$resource,如下所示:

代码语言:javascript
复制
factory('User', function($resource){
    return $resource(endpoint + '/user/current/:projectId', {},
        {get: 
            {
                cache: true,
                method: 'GET'
            }
        }
    );
})

这非常有效,即我的服务器在我的应用程序中只被调用一次,然后从缓存中获取值。

但是我需要在某个操作之后刷新服务器中的值。有什么简单的方法可以做到这一点吗?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-12 19:59:21

保留布尔值并获取$http缓存:

代码语言:javascript
复制
var $httpDefaultCache = $cacheFactory.get('$http');

然后,您可以像使用$cacheFactory创建的任何其他缓存一样对其进行控制,下面提供了一个使用实例:

代码语言:javascript
复制
$httpDefaultCache.remove(key);
// Where key is the relative URL of your resource (eg: /api/user/current/51a9020d91799f1e9b8db12f)
票数 118
EN

Stack Overflow用户

发布于 2013-06-12 15:53:02

与在每个actioncache属性中使用布尔参数不同,您可以传递一个使用$cacheFactory创建的缓存实例,您可以对其进行更多的控制(即清除缓存)。

示例用法:

代码语言:javascript
复制
app.factory('Todos', function($resource, $cacheFactory) {
    var cache = $cacheFactory('todo');
    return $resource(apiBaseUrl + '/todos/:id', { id: '@id' }, {
        'get': { method: 'GET', cache: cache  },
        'query': { method: 'GET', cache: cache, isArray: true }
    });
});
票数 18
EN

Stack Overflow用户

发布于 2013-11-10 02:11:44

我偶然发现这个线程在寻找类似的东西,但发现$resource会自动为您管理缓存,因此不需要强制清除缓存。

其思想是,如果您有一个可以查询的资源,则该查询响应将被缓存,但如果您为同一资源保存了一些内容,则以前缓存的数据肯定是无效的,因此将为您清除该数据。它以这种方式工作是有道理的。

下面是我用来做这件事的一些代码(您可以忽略可能看起来很奇怪的工厂创建部分,而关注"class“主体)。

代码语言:javascript
复制
'use strict';

sampleApp.players.$ng.factory('sampleApp.players.PlayerService', [
    '$log',
    '$resource',
    sampleApp.players.PlayerService = function ($log, $resource) {
        var service = {};

        $log.info('Creating player resource.');
        var Player = $resource('/api/players', {}, {query: {
            isArray: true,
            cache: true,
            method: 'GET'
        }});

        service.addPlayer = function(playerName) {
            $log.info('Saving a new player.');
            return new Player({name: playerName}).$save();
        };

        service.listPlayers = function () {
            $log.info('Fetching players.');
            return Player.query();
        };

        return service;
    }]);

如果多次调用listPlayers函数,则第一次调用将发出http get请求,并且所有后续调用都将被缓存。但是,如果调用addPlayer,则会按预期执行http post,然后下一次调用listPlayers将执行http get (未缓存)。

这让你远离了管理别人($http)缓存的事务,并试图跟上哪些url被用于请求,哪些正在在正确的时间清除缓存。

我想这个故事的寓意是与图书馆合作,一切都会好起来的……除了任何bug或不完整的特性,但是Angular没有这些;)

附注:这些都是在AngularJS 1.2.0上运行的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17059569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档