Como atualizar / invalidar o cache de resources $ no AngularJS

Eu tenho um recurso User $ simples que usa a implementação de cache $ http padrão da seguinte forma:

factory('User', function($resource){ return $resource(endpoint + '/user/current/:projectId', {}, {get: { cache: true, method: 'GET' } } ); }) 

Isso funciona muito bem, ou seja, meu servidor é chamado apenas uma vez em meu aplicativo e, em seguida, o valor é buscado no cache.

Mas preciso atualizar o valor do servidor após uma determinada operação. Existe uma maneira fácil de fazer isso?

Obrigado.

Mantenha o booleano e obtenha o cache $http :

 var $httpDefaultCache = $cacheFactory.get('$http'); 

Então você pode controlá-lo como qualquer outro cache feito com $cacheFactory , uma instância de uso fornecida abaixo:

 $httpDefaultCache.remove(key); // Where key is the relative URL of your resource (eg: /api/user/current/51a9020d91799f1e9b8db12f) 

Em vez de usar um argumento booleano na propriedade cache de cada action você pode passar uma instância de cache criada com $ cacheFactory da qual você pode ter mais controle (ou seja, limpar o cache).

Exemplo de uso:

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

Eu me deparei com esse segmento procurando por algo semelhante, mas descobri que $ resource irá gerenciar o cache para você automaticamente, então não há necessidade de forçar o cache a ser limpo.

A ideia é que, se você tiver um recurso que possa consultar, essa resposta da consulta será armazenada em cache, mas se você salvar algo para esse mesmo recurso, os dados armazenados anteriormente em cache deverão ser inválidos, portanto, ele será limpo para você. Faz sentido que funcione dessa maneira.

Aqui está algum código que eu uso para fazer isso (você pode ignorar a parte de criação de fábrica possivelmente estranha e prestar atenção ao corpo de “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; }]); 

Se você chamar a function listPlayers várias vezes, a primeira chamada fará uma solicitação de obtenção HTTP e todas as chamadas subseqüentes serão armazenadas em cache. Se você chamar addPlayer, uma postagem http é executada como esperado e, em seguida, a próxima chamada a listarPlayers executará uma obtenção HTTP (não armazenada em cache).

Isso mantém você fora do negócio de gerenciar o cache de alguém ($ http) e tentar acompanhar quais URLs estão sendo usados ​​para solicitações e quais estão limpando caches nos momentos certos.

Eu suponho que a moral da história aqui é trabalhar com a biblioteca e tudo ficará bem … exceto por quaisquer erros ou resources incompletos, mas o Angular não tem nenhum desses;)

ps Isso tudo está rodando no AngularJS 1.2.0.