【发布时间】:2014-03-28 17:39:50
【问题描述】:
我有一个 $resource,我用它来获取一个或所有注册,创建新的或更新现有的注册,删除注册......作品。这是资源的代码:
.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 对象的列表,而只是 1 个条目,其中包含一个表示所有项目的 json 的实际字符串。然后我正在做的是对该字符串进行 jsonifying,删除已删除的项目并再次对列表进行字符串化。
对于创作,我没有那么有创意,我只能删除缓存中的一个条目(代表完整的集合)并从服务器重新加载所有数据。这是我使缓存无效的方法。
$cacheFactory.get('$http').remove('api/registrations/' + $scope.assetType);
我可能遗漏了一些明显的东西。有人有任何建议或澄清吗?谢谢!
【问题讨论】:
-
那么如果你不与服务器通信,为什么需要使用
cache? -
它在哪里说我没有与服务器通信?在添加/删除项目后,我只想要一种简单的方法来更新我的客户端 $cache。实际上,我认为 Angular 的 $resource 会为我做到这一点。
-
“但我正在客户端更改此数据 - 不需要往返服务器。”也许我误解了你的问题,但你为什么需要缓存?你不能只更新你的客户对象吗?
-
如果我不启用我的 $resource 的缓存,每次我加载我的页面时,都会从服务器获取数据。
-
好的,我想如果我通过 $resource 保存一个项目并将创建的项目发回,Angular 可能足够聪明,可以使用该项目更新其缓存。或者提供一种简单的方法让我更新该缓存。
标签: javascript angularjs caching