我有一个$资源,我用它来获取一个或所有注册,创建新的或更新现有注册,删除注册......工作。这是资源的代码:
.factory('Registrations', function ($resource) {
return $resource('api/registrations/:assetType/:registrationId',
{assetType: '@assetType', registrationId: '@assetRegistrationId'},
{query: {
method: 'GET',
cache: true,
isArray: true
}}
);
})
正如您所看到的,缓存已经到位,这样可以正常工作:后续请求不会传播到服务器。除了......在创建或删除注册后,缓存不会更新。
为了删除,我提出了这个解决方法。它看起来很糟糕但是很有效。但是有一些奇怪的事情需要注意:
Registrations.delete({assetType: $scope.assetType, registrationId: registration.assetRegistrationId}, function () {
//doesn't seem to work -> dirty hack
//$cacheFactory.get('$http').remove('api/registrations/' + $scope.assetType + '/' + registration.registrationId);
var cached = $cacheFactory.get('$http').get('api/registrations/' + $scope.assetType);
var cachedRegistrations = JSON.parse(cached[1]);
var registrationInCache = get(cachedRegistrations, registration.assetRegistrationId);
if (registrationInCache) {
cachedRegistrations.splice(cachedRegistrations.indexOf(registrationInCache), 1);
cached[1] = JSON.stringify(cachedRegistrations);
}
$scope.registrations = Registrations.query({assetType: $scope.assetType});
//...
令人惊讶的是,缓存不会保留javascript对象列表,而只是一个条目,其中一个实际字符串表示所有项目的json。我正在做的就是将该字符串jsonifying,删除已删除的项目并再次对列表进行字符串化。
对于创作,我没有那么有创意,我只能删除缓存中的那一个条目(代表完整的集合)并从服务器重新加载所有数据。这是我如何使缓存无效。
$cacheFactory.get('$http').remove('api/registrations/' + $scope.assetType);
我可能错过了一些明显的东西。有人提出任何建议或澄清吗?谢谢!
答案 0 :(得分:1)
我认为这种缓存应该在服务器端完成,而不是在前端(AngularJS)。我不是100%确定Angular的cache=true
是如何工作的,但我相信它只是缓存结果,因此额外的请求将获得缓存的结果。 Angular无法判断服务器上的数据何时发生了变化。