在AngularJS中,CacheFactory是单例模式吗?

6

我使用CacheFactory创建了一个服务。我期望它是一个单例模式。我将其注入到我的控制器中,在控制器的作用域内可以正常运行。但是一旦跳转到不同作用域的另一页,我好像并没有在同一控制器中存储在缓存中的值。CacheFactory的行为难道不应该是单例模式,使我在注入CacheService时具有相同的缓存对象吗?

以下是我的服务示例:

angular.module('MyService', []).factory('CacheService', function($cacheFactory) {
        return $cacheFactory('cacheService', {
            capacity: 3 // optional - turns the cache into LRU cache
        })
    });

然后在我的控制器中:

function MyController($scope, CacheService) {
   var results= CacheService.get('storedvalue');
   if(!results){
       CacheService.put('storedvalue', results);
      alert('results not stored');
   }
   else
      alert('results stored');
}
1个回答

16

$cacheFactory实际上不是您想要使用的服务,它是您用来创建单例服务的工厂。根据您的代码大致推测,它似乎应该能够正常工作。但我已经创建了一个演示来证明它确实有效。这里是服务:

.factory('CacheService', function($cacheFactory) {
   var cache = $cacheFactory('cacheService', {
     capacity: 3 // optional - turns the cache into LRU cache
   });

   return cache;
});
在这个例子中,CacheService是一个单例,它拥有一个使用$cacheFactory创建的本地缓存,我们将从该服务返回。我们可以将其注入到任何想要的控制器中,它总是返回相同的值。
这里是一个可用的Plunker链接:http://plnkr.co/edit/loKWGms1lMCnmiWa1QA7?p=preview 如果您的帖子没有包含导致代码出错的内容,请随时更新我的Plunker以使其出错,之后我们可以从那里开始。

谢谢Josh。你的例子很有效。现在我仔细看了一下,我的也可以工作。但是如果我刷新浏览器,它就不起作用了。现在我想想,这可能是有道理的,因为当我刷新浏览器时,它会重新启动angularjs。所以在这种情况下,我不再拥有缓存中的值,你同意吗? - DavidB
1
是的,状态完全绑定到当前页面加载。AngularJS(以及所有客户端MVC框架)旨在用于单页应用程序(尽管它们不仅限于此)。但是,如果需要,您可以使用本地存储来持久化。您只需要自己编写服务即可。 - Josh David Miller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接