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

时间:2013-06-12 07:08:08

标签: angularjs angularjs-resource

我有一个简单的User $资源,它使用默认的$ http缓存实现,如下所示:

factory('User', function($resource){
    return $resource(endpoint + '/user/current/:projectId', {},
        {get: 
            {
                cache: true,
                method: 'GET'
            }
        }
    );
})

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

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

感谢。

3 个答案:

答案 0 :(得分:115)

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

var $httpDefaultCache = $cacheFactory.get('$http');

然后您可以像使用$cacheFactory制作的任何其他缓存一样控制它,下面提供了一个用法实例:

$httpDefaultCache.remove(key);
// Where key is the relative URL of your resource (eg: /api/user/current/51a9020d91799f1e9b8db12f)

答案 1 :(得分:17)

不是在每个cache的{​​{1}}属性中使用布尔参数,而是可以传递使用$cacheFactory创建的缓存实例,您可以对其进行更多控制(即清除缓存) )。

使用示例:

action

答案 2 :(得分:6)

我遇到了这个线程寻找类似的东西,但发现$ resource会自动为你管理缓存,所以不需要强制清除缓存。

这个想法是,如果您有一个可以查询的资源,那么该查询响应将被缓存,但如果您为同一资源保存了某些内容,则先前缓存的数据必须无效,因此它将被清除。它会以这种方式工作是有意义的。

这是我用来做这个的一些代码(你可以忽略可能看起来奇怪的工厂创建部分并注意“类”体)。

'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帖子,然后下一次调用listPlayers将执行http get(未缓存)。

这使您无法管理其他人的($ http)缓存,并试图跟上哪些URL用于请求以及哪些URL在正确的时间清除缓存。

我认为这里故事的寓意是与图书馆合作,一切都会好......除了任何错误或不完整的功能,但Angular没有任何这些;)

P.S。这一切都在AngularJS 1.2.0上运行。