96

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

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

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

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

谢谢。

4

3 回答 3

119

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

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

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

$httpDefaultCache.remove(key);
// Where key is the relative URL of your resource (eg: /api/user/current/51a9020d91799f1e9b8db12f)
于 2013-06-12T11:59:20.913 回答
18

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

示例用法:

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 }
    });
});
于 2013-06-12T07:53:01.620 回答
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 post,然后对 listPlayers 的下一次调用将执行 http get(未缓存)。

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

我想这里的故事的寓意是使用图书馆,一切都会好起来的......除了任何错误或不完整的功能,但 Angular 没有任何这些;)

ps 这一切都在 AngularJS 1.2.0 上运行。

于 2013-11-09T18:11:43.827 回答