如何在AngularJS中刷新/无效$资源caching

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

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

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

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

谢谢。

保持布尔值并获得$httpcaching:

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

然后你可以像使用$cacheFactory (下面提供的一个使用实例)创build的其他caching一样控制它:

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

您可以在每个actioncache属性中使用布尔参数,而不必在每个action的caching实例上使用$ cacheFactory创buildcaching实例,从而可以进行更多的控制(即清除caching)。

用法示例:

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

我遇到这个线程寻找类似的东西,但发现$资源将自动pipe理caching为你,所以没有必要强制caching清除。

这个想法是,如果你有一个你可以查询的资源,这个查询响应将被caching,但是如果你为同一个资源保存了一些东西,那么以前caching的数据必须是无效的,所以它会被清除。 这是有道理的,它会这样工作。

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

 '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请求,并且所有后续调用都将被caching。 如果你调用addPlayer的话,http post是按照预期执行的,然后下一次调用listPlayers将执行一个http get(不caching)。

这使您无法pipe理其他人的($ http)caching,并试图跟上哪些url被用于请求,哪些url正确地在正确的时间清除caching。

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

ps这是所有在AngularJS 1.2.0上运行。