Как обновить / аннулировать кэш $ ресурса в AngularJS
У меня есть простой пользовательский ресурс $, который использует реализацию кэша $ http по умолчанию следующим образом:
factory('User', function($resource){
return $resource(endpoint + '/user/current/:projectId', {},
{get:
{
cache: true,
method: 'GET'
}
}
);
})
Это работает очень хорошо, то есть мой сервер вызывается только один раз в моем приложении, затем значение выбирается из кеша.
Но мне нужно обновить значение с сервера после определенной операции. Есть ли простой способ сделать это?
Благодарю.
3 ответа
Держите логическое значение и получите $http
кэш:
var $httpDefaultCache = $cacheFactory.get('$http');
Тогда вы можете управлять им, как и любой другой кеш, созданный с $cacheFactory
ниже приведен пример использования:
$httpDefaultCache.remove(key);
// Where key is the relative URL of your resource (eg: /api/user/current/51a9020d91799f1e9b8db12f)
Вместо использования логического аргумента в cache
собственность каждого action
вы можете передать экземпляр кэша, созданный с помощью $ cacheFactory, который вы можете контролировать больше (то есть очистить кеш).
Пример использования:
app.factory('Todos', function($resource, $cacheFactory) {
var cache = $cacheFactory('todo');
return $resource(apiBaseUrl + '/todos/:id', { id: '@id' }, {
'get': { method: 'GET', cache: cache },
'query': { method: 'GET', cache: cache, isArray: true }
});
});
Я наткнулся на эту тему в поисках чего-то похожего, но обнаружил, что $ resource будет автоматически управлять кешем для вас, поэтому нет необходимости принудительно очищать кеш.
Идея состоит в том, что если у вас есть ресурс, который вы можете запросить, то ответ на запрос будет кэширован, но если вы сохраните что-то для этого же ресурса, ранее кэшированные данные должны быть недействительными, поэтому они будут очищены для вас. Это имеет смысл, что это будет работать таким образом.
Вот некоторый код, который я использую для этого (вы можете игнорировать потенциально странно выглядящую часть создания фабрики и обратить внимание на тело "класса").
'use strict';
sampleApp.players.$ng.factory('sampleApp.players.PlayerService', [
'$log',
'$resource',
sampleApp.players.PlayerService = function ($log, $resource) {
var service = {};
$log.info('Creating player resource.');
var Player = $resource('/api/players', {}, {query: {
isArray: true,
cache: true,
method: 'GET'
}});
service.addPlayer = function(playerName) {
$log.info('Saving a new player.');
return new Player({name: playerName}).$save();
};
service.listPlayers = function () {
$log.info('Fetching players.');
return Player.query();
};
return service;
}]);
Если вы вызываете функцию listPlayers несколько раз, первый вызов отправляет запрос http get и все последующие вызовы кэшируются. Однако если вы вызываете addPlayer, публикация http выполняется должным образом, а затем при следующем вызове listPlayers выполняется http get (не кэшируется).
Это не позволяет вам управлять чужим кешем ($http) и пытаться следить за тем, какие URL используются для запросов, а какие очищают кеш в нужное время.
Я полагаю, что мораль этой истории в том, чтобы работать с библиотекой, и все будет хорошо... за исключением каких-либо ошибок или неполных функций, но в Angular таких нет;)
PS Это все работает на AngularJS 1.2.0.