xyz resource googleapis example angularjs angularjs-resource

angularjs - googleapis - ngresource



Invalidar $ caché de recursos después de la solicitud posterior (3)

Podría crear un servicio de envoltura para hacer el almacenamiento en caché como desee, por ejemplo:

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

Luego reemplace cualquier $resource con cachedResource .

Ejemplo plunker: http://plnkr.co/edit/lIQw4uogcoMpcuHTWy2U?p=preview

Estoy usando $ resource y guardando en caché los resultados de las solicitudes de obtención. Mi problema es que, después de las solicitudes de correos, el caché no se invalida.

Aquí está el valor de retorno del servicio:

return $resource(''http://url.com/api/url/:id'', {}, { ''query'' : { method : ''GET'', isArray:true, cache : true }, ''get'' : { method : ''GET'', cache : false } })

Aquí está el método de guardar que estoy usando dentro de mi controlador. Como puede ver, estoy usando la devolución de llamada en la solicitud posterior para volver a calcular la consulta / lista de nombres.

var newNoun = new Noun($scope.noun); newNoun.$save(function(x) { $scope.nouns = Noun.query(); });

Me gustaría invalidar el caché después de llamar a la publicación u otro método que no sea de obtención. ¿Cómo podría hacer esto? ¿Ya está integrado en $ resource o necesito implementarlo por mi cuenta?


Si bien la respuesta anterior de @ runTarm es excelente, no permite que las acciones se puedan personalizar fácilmente desde el servicio heredado, por ejemplo, lo siguiente no sería posible:

app.factory(''Steps'', function (CachedResource) { return CachedResource(''/steps/:stepId'', {}, { save: { method: ''POST'', params: { stepId: ''@stepId'' } } }); });

En este caso, esta definición de save sería reemplazada por la presente en CachedResource .

Solución

Pero se puede arreglar fácilmente desde Angular 1.4 reemplazando

actions = angular.extend({}, actions, {

con

actions = angular.merge({}, actions, {

para que ambos objetos se fusionen en profundidad.

Mejor solucion

En el escenario anterior, las opciones de acción definidas en CachedResource se preferirían a la configuración personalizada al heredar servicios. Para arreglar eso, cambia el orden de los argumentos pasados ​​a merge :

actions = angular.merge({}, { /* default options get, query, etc. */ }, actions);

Con esta solución, lo siguiente funcionará de la manera esperada (es decir, use DESTROY lugar del valor predeterminado DELETE cuando se llama remove ):

app.factory(''Steps'', function (CachedResource) { return CachedResource(''/steps/:stepId'', {}, { remove: { method: ''DESTROY'' } }); });


$resource está usando el caché predeterminado para $http .

Puede acceder a él usando: $cacheFactory.get(''$http'')

Puede eliminar un par de valores clave utilizando el método de remove({string} key) cachés devueltos remove({string} key) .

P.ej:

var key = ''...the key you want to remove, e.g. `/nouns/5`...''; $cacheFactory.get(''$http'').remove(key);