访问同一Angular模块中的工厂

时间:2015-01-29 07:17:12

标签: angularjs angularjs-factory removeall cachefactory

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

例如,

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

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

问题在于,有时我想清除所有缓存。所以我想将所有cacheFactories放入一个CacheCentralApp模块,并通过一次调用删除所有缓存。

问题是,我不知道如何访问我模块中的其他工厂。因此,例如,如果我创建一个模块CacheCentralApp,并在其中声明提供cacheFactory的工厂,我如何在那里创建一个函数,在每个{{1}上调用removeAll() }}?

2 个答案:

答案 0 :(得分:1)

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

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

$scope.$broadcast('clearAllCaches');    

在每个工厂听这个事件:

$scope.$on('clearAllCaches', function() {
    clearCache();
}

答案 1 :(得分: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或其他库来确保您的代码正常运行。