我有一个使用默认$http缓存实现的简单用户$resource,如下所示:
factory('User', function($resource){
return $resource(endpoint + '/user/current/:projectId', {},
{get:
{
cache: true,
method: 'GET'
}
}
);
})
这非常有效,即我的服务器在我的应用程序中只被调用一次,然后从缓存中获取值。
但是我需要在某个操作之后刷新服务器中的值。有什么简单的方法可以做到这一点吗?
谢谢。
发布于 2013-06-12 19:59:21
保留布尔值并获取$http
缓存:
var $httpDefaultCache = $cacheFactory.get('$http');
然后,您可以像使用$cacheFactory
创建的任何其他缓存一样对其进行控制,下面提供了一个使用实例:
$httpDefaultCache.remove(key);
// Where key is the relative URL of your resource (eg: /api/user/current/51a9020d91799f1e9b8db12f)
发布于 2013-06-12 15:53:02
与在每个action
的cache
属性中使用布尔参数不同,您可以传递一个使用$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 }
});
});
发布于 2013-11-10 02:11:44
我偶然发现这个线程在寻找类似的东西,但发现$resource会自动为您管理缓存,因此不需要强制清除缓存。
其思想是,如果您有一个可以查询的资源,则该查询响应将被缓存,但如果您为同一资源保存了一些内容,则以前缓存的数据肯定是无效的,因此将为您清除该数据。它以这种方式工作是有道理的。
下面是我用来做这件事的一些代码(您可以忽略可能看起来很奇怪的工厂创建部分,而关注"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 post,然后下一次调用listPlayers将执行http get (未缓存)。
这让你远离了管理别人($http)缓存的事务,并试图跟上哪些url被用于请求,哪些正在在正确的时间清除缓存。
我想这个故事的寓意是与图书馆合作,一切都会好起来的……除了任何bug或不完整的特性,但是Angular没有这些;)
附注:这些都是在AngularJS 1.2.0上运行的。
https://stackoverflow.com/questions/17059569
复制相似问题