Как обновить/недействить кеш ресурсов $в AngularJS
У меня есть простой ресурс User $, который использует реализацию кэша по умолчанию $http так:
factory('User', function($resource){
return $resource(endpoint + '/user/current/:projectId', {},
{get:
{
cache: true,
method: 'GET'
}
}
);
})
Это работает очень хорошо, т.е. мой сервер вызывается только один раз в моем приложении, тогда значение извлекается из кеша.
Но мне нужно обновить значение с сервера после определенной операции. Есть ли простой способ сделать это?
Спасибо.
Ответы
Ответ 1
Сохраните логическое значение и получите кеш $http
:
var $httpDefaultCache = $cacheFactory.get('$http');
Затем вы можете управлять им, как и любой другой кеш, созданный с помощью $cacheFactory
, примера использования, приведенного ниже:
$httpDefaultCache.remove(key);
// Where key is the relative URL of your resource (eg: /api/user/current/51a9020d91799f1e9b8db12f)
Ответ 2
Вместо использования логического аргумента в свойстве 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 }
});
});
Ответ 3
Я наткнулся на эту тему, ища что-то подобное, но обнаружил, что $resource автоматически будет управлять кешем, поэтому нет необходимости принудительно очищать кеш.
Идея состоит в том, что если у вас есть ресурс, который вы можете запросить, этот запрос будет кэшироваться, но если вы сохраните что-то для этого же ресурса, ранее кэшированные данные должны быть недействительными, поэтому он будет очищен для вас. Имеет смысл, что он будет работать таким образом.
Вот некоторый код, который я использую для этого (вы можете игнорировать возможную нечетную структуру создания factory и обращать внимание на тело "class" ).
'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-получение (не кэшируется).
Это избавляет вас от необходимости управления кешем другого ($ http) и пытается не отставать от того, какой URL-адрес используется для запросов и который очищает кеши в нужное время.
Я полагаю, что мораль этой истории - работать с библиотекой, и все будет хорошо... за исключением любых ошибок или неполных функций, но Angular не имеет ни одного из них;)
p.s. Это все работает на AngularJS 1.2.0.