我有一个简单的User $资源,它使用默认的$ http缓存实现,如下所示:
factory('User', function($resource){
return $resource(endpoint + '/user/current/:projectId', {},
{get:
{
cache: true,
method: 'GET'
}
}
);
})
这非常有效,即我的服务器只在我的应用程序中调用一次,然后从缓存中获取值。
但是我需要在某个操作后刷新服务器的值。有没有一种简单的方法可以做到这一点?
感谢。
答案 0 :(得分:115)
保留布尔值并获取$http
缓存:
var $httpDefaultCache = $cacheFactory.get('$http');
然后您可以像使用$cacheFactory
制作的任何其他缓存一样控制它,下面提供了一个用法实例:
$httpDefaultCache.remove(key);
// Where key is the relative URL of your resource (eg: /api/user/current/51a9020d91799f1e9b8db12f)
答案 1 :(得分:17)
答案 2 :(得分:6)
我遇到了这个线程寻找类似的东西,但发现$ resource会自动为你管理缓存,所以不需要强制清除缓存。
这个想法是,如果您有一个可以查询的资源,那么该查询响应将被缓存,但如果您为同一资源保存了某些内容,则先前缓存的数据必须无效,因此它将被清除。它会以这种方式工作是有意义的。
这是我用来做这个的一些代码(你可以忽略可能看起来奇怪的工厂创建部分并注意“类”体)。
'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 get(未缓存)。
这使您无法管理其他人的($ http)缓存,并试图跟上哪些URL用于请求以及哪些URL在正确的时间清除缓存。
我认为这里故事的寓意是与图书馆合作,一切都会好......除了任何错误或不完整的功能,但Angular没有任何这些;)
P.S。这一切都在AngularJS 1.2.0上运行。