Неправильный кеш $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 или другого не полученного метода. Как я мог это сделать? Это уже встроено в $ resource или мне нужно реализовать это самостоятельно?

3 ответа

Решение

Вы можете создать сервис-оболочку для кэширования, как вы хотите, например:

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,

Пример плункера: http://plnkr.co/edit/lIQw4uogcoMpcuHTWy2U?p=preview

Хотя ответ @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' }
    });
}); 

$resource использует кэш по умолчанию для $http,

Вы можете получить к нему доступ, используя: $cacheFactory.get('$http')

Вы можете удалить пару ключ-значение, используя возвращенные кеши. remove({string} key) метод.


Например:

var key = '...the key you want to remove, e.g. `/nouns/5`...';
$cacheFactory.get('$http').remove(key);
Другие вопросы по тегам