在AngularJs中,如何在缓存中添加/删除$资源项

时间:2014-03-27 16:24:33

标签: javascript angularjs caching

我有一个$资源,我用它来获取一个或所有注册,创建新的或更新现有注册,删除注册......工作。这是资源的代码:

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

我可能错过了一些明显的东西。有人提出任何建议或澄清吗?谢谢!

1 个答案:

答案 0 :(得分:1)

我认为这种缓存应该在服务器端完成,而不是在前端(AngularJS)。我不是100%确定Angular的cache=true是如何工作的,但我相信它只是缓存结果,因此额外的请求将获得缓存的结果。 Angular无法判断服务器上的数据何时发生了变化。