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