我正在使用 $resource 并缓存 get 请求的结果。我的问题是,在发布请求后,缓存没有失效。
这是服务的返回值:
return $resource('http://url.com/api/url/:id', {}, {
'query' : {
method : 'GET',
isArray:true,
cache : true
},
'get' : {
method : 'GET',
cache : false
}
})
这是我在 Controller 中使用的保存方法。如您所见,我正在使用 post 请求上的回调来重新计算查询/名词列表。
var newNoun = new Noun($scope.noun);
newNoun.$save(function(x) {
$scope.nouns = Noun.query();
});
我想在调用 post 或其他非 get 方法后使缓存无效。我怎么能这样做?这是否已经内置在 $resource 中,还是我需要自己实现?
最佳答案
虽然上面@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' }
});
});
关于angularjs - 发布请求后使 $resource 缓存无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25117388/