0

在我的 Angular 应用程序中,我有一些资源模块,每个模块都包含一些cache工厂。

例如,

projectRsrc.factory('getProjectCache', ['$cacheFactory', function($cacheFactory){
    return $cacheFactory('getProjectCache');
}]); 

我有一些用于缓存从服务器接收到的值。

问题是有时我想清除所有缓存。因此,我想将所有内容cacheFactories放入一个CacheCentralApp模块中,并通过一次调用删除所有缓存。

问题是,我不知道有什么方法可以访问我模块中的其他工厂。例如,如果我创建一个模块CacheCentralApp,并在其中声明提供cacheFactorys 的工厂,我如何在其中创建一个调用removeAll()每个模块的函数cacheFactory

4

2 回答 2

1

我认为不可能针对某个模块的所有工厂。但是,我认为解决您的问题的另一种方法是发送一个必须清除所有工厂的事件。这将防止您必须遍历所有工厂并对每个人调用 .clear() 函数。

您可以使用以下代码发送事件请求:

$scope.$broadcast('clearAllCaches');    

并通过以下方式在每个工厂收听此事件:

$scope.$on('clearAllCaches', function() {
    clearCache();
}
于 2015-01-29T07:36:53.360 回答
0

在一个单独的模块中,您可以为此创建一个工厂:

var cacheModule = angular.module('CacheCentralApp', []);
cacheModule.factory('MyCacheFactory', ['$cacheFactory', function($cacheFactory) {
  var cacheKeys = [];
  return {
    clearAll: function() {
      angular.forEach(cacheKeys, function(key) {
        $cacheFactory.get(key).removeAll();
      });
    },
    get: function(key) {
      if(cacheKeys.indexOf(key) == -1) {
        cacheKeys.push(key);
        return $cacheFactory(key);
      } else {
        return $cacheFactory.get(key);
      }
    }
  }
}]);

要创建新的或获取现有的Cache,您只需调用MyCacheFactory.get(cacheName). 要清除您调用的工厂中创建的所有缓存MyCacheFactory.clearAll()

注意:我不太确定它Array.indexOf在每个浏览器中都可用,您可能想要使用Lo-Dash或其他库来确保您的代码有效。

于 2015-01-29T08:08:18.920 回答