我正在使用$ resource并缓存get请求的结果。我的问题是,在发布请求后,缓存不会失效。
这是服务的返回值:
return $resource('http://url.com/api/url/:id', {}, { 'query' : { method : 'GET', isArray:true, cache : true }, 'get' : { method : 'GET', cache : false } })
这是我在控制器内部使用的保存方法。如您所见,我正在对post请求使用回调,以重新计算名词的查询/列表。
var newNoun = new Noun($scope.noun); newNoun.$save(function(x) { $scope.nouns = Noun.query(); });
我想在调用post或其他非get方法后使缓存无效。我该怎么办?这是否已经内置在$ resource中,还是我需要自己实现?
您可以创建包装器服务以根据需要进行缓存,例如:
app.factory('cachedResource', function ($resource, $cacheFactory) { var cache = $cacheFactory('resourceCache'); var interceptor = { response: function (response) { cache.remove(response.config.url); console.log('cache removed', response.config.url); return response; } }; return function (url, paramDefaults, actions, options) { actions = angular.extend({}, actions, { 'get': { method: 'GET', cache: cache }, 'query': { method: 'GET', cache: cache, isArray: true }, 'save': { method: 'POST', interceptor: interceptor }, 'remove': { method: 'DELETE', interceptor: interceptor }, 'delete': { method: 'DELETE', interceptor: interceptor }, }); return $resource(url, paramDefaults, actions, options); }; });
然后将替换$resource为cachedResource。
$resource
cachedResource
例子示例: http ://plnkr.co/edit/lIQw4uogcoMpcuHTWy2U?p=preview