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


94

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

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

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

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

谢谢。


1
我使用的是不稳定对象(1.1.5,但我认为从1.1.2开始就存在)cache{boolean|Cache}–如果为true,则将使用默认的$ http缓存来缓存GET请求,否则,如果使用以下实例构建的缓存实例
AlexandreBultéJun

1
我有类似的问题,但仅在测试时。我如何在浏览器级别清除此内容?
chovy

Answers:


116

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

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

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

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

52
完美,谢谢!正是我想要的。对于那些想知道的人,可以调用$ cacheFactory.get('$ http')。remove(key),其中key是资源的相对URL(例如:/ api / user / current / 51a9020d91799f1e9b8db12f)。
AlexandreBulté2013年

2
实际上,我发现调用remove()时需要指定完整的URL以及所有查询参数。我在这里想念什么吗?
shangxiao

3
我有动态查询参数。有没有办法从$resource工厂访问URL ?
suzanshakya

1
虽然这有效。它可能比需要的更为复杂。一个更好的解决方案是如果实现的话:github.com/angular/angular.js/issues/9064
KFunk 2014年

5
对我来说,$ cacheFactory.get('$ http')。removeAll()可以解决问题,因为我需要清除所有缓存的数据。
S. Baggy 2015年

18

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

用法示例:

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 }
    });
});

谢谢。我也看到了,但是在走这条路之前,我一直在寻找一种“标准”的方法……
AlexandreBulté13年

1
似乎是非常符合“角度方式”的“标准”方法:)
2013年

1
你是对的。我的意思是使用标准$ resource缓存的方法。
AlexandreBulté2013年

6

我遇到了这个线程,寻找类似的东西,但是发现$ resource将自动为您管理缓存,因此无需强制清除缓存。

这个想法是,如果您拥有可以查询的资源,则将缓存该查询响应,但是如果您为该资源保存内容,则先前缓存的数据必须无效,因此将为您清除。它将以这种方式起作用是有道理的。

这是我用来执行此操作的一些代码(您可以忽略可能看起来古怪的工厂创建部分,并注意“ class”主体)。

'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用于请求以及在正确的时间清除缓存。

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

ps这全部在AngularJS 1.2.0上运行。


2
是的,我理解并承认,在“正常”情况下,Angular资源知道如何以及何时使缓存无效,并且它可以完美地工作。但是我的用例略有不同:我想强制刷新,因为Angular无法知道是否需要刷新-在Angular应用程序外部修改了用户对象。
2013年

3
谁能指出这是在哪里记录的?我之前在Stack Overflow上已经阅读过有关此内容的信息,但在文档中找不到任何提及。我也在我的应用程序中尝试过,但是在执行过程中可能做错了什么……
Sunil D.

1
但是,它似乎无法与$ delete一起使用。下一个调用将再次从缓存中拉出,并且删除的项目将重新出现。谁能确认?
卢克斯2014年

这将无法正常工作ngResource不处理缓存失效去这里例如:stackoverflow.com/questions/25117388/...
HugoPoi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.