我正在使用$ 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中了,还是我需要自己实现它?
答案 0 :(得分:29)
您可以创建一个包装器服务来执行您想要的缓存,例如:
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
。
示例plunker: http://plnkr.co/edit/lIQw4uogcoMpcuHTWy2U?p=preview
答案 1 :(得分:5)
虽然上面的@ runTarm答案很棒,但它不允许从继承服务轻松定制操作,例如:以下是不可能的:
app.factory('Steps', function (CachedResource) {
return CachedResource('/steps/:stepId', {}, {
save: { method: 'POST', params: { stepId: '@stepId' } }
});
});
在这种情况下,save
的定义将替换为CachedResource
中的定义。
但是可以通过替换
轻松地从 Angular 1.4 修复actions = angular.extend({}, actions, {
与
actions = angular.merge({}, actions, {
这样两个对象都是深度合并的。
在上面的场景中,CachedResource中定义的操作选项优先于继承服务中的自定义配置。要解决此问题,请切换传递给merge
的参数的顺序:
actions = angular.merge({}, { /* default options get, query, etc. */ }, actions);
使用此解决方案,以下内容将按预期工作(即在调用DESTROY
时使用DELETE
而不是默认remove
:
app.factory('Steps', function (CachedResource) {
return CachedResource('/steps/:stepId', {}, {
remove: { method: 'DESTROY' }
});
});
答案 2 :(得分:1)
$resource
正在使用$http
的默认缓存。
您可以使用以下网址访问它:$cacheFactory.get('$http')
您可以使用返回的缓存remove({string} key)
方法删除键值对。
E.g:
var key = '...the key you want to remove, e.g. `/nouns/5`...';
$cacheFactory.get('$http').remove(key);