一尘不染

发布请求后使$ resource缓存无效

angularjs

我正在使用$ 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中,还是我需要自己实现?


阅读 280

收藏
2020-07-04

共1个答案

一尘不染

您可以创建包装器服务以根据需要进行缓存,例如:

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

然后将替换$resourcecachedResource

例子示例: http
://plnkr.co/edit/lIQw4uogcoMpcuHTWy2U?p=preview

2020-07-04