【问题标题】:In AngularJs, how to add/remove $resource items to/from the cache在 AngularJs 中,如何在缓存中添加/删除 $resource 项
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 但我正在客户端更改此数据 - 不需要往返服务器。
  • 对,那么为什么需要缓存呢?如果它已经在客户端(就像 Angular 缓存一样),那么它应该非常快,或者至少与从缓存加载一样快。
  • 我的意思是,在这两种情况下,您都在加载客户端中已经存在的内容,因此无需使用缓存。
猜你喜欢
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
相关资源
最近更新 更多