Доступ к фабрикам в том же модуле Angular

В моем приложении Angular есть несколько модулей ресурсов, каждый из которых содержит несколько cache фабрик.

Например,

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

У меня есть несколько из них для кэширования значений, полученных с серверов.

Проблема в том, что иногда я хотел бы очистить все кеши. Итак, я хочу поместить все cacheFactories в один модуль CacheCentralApp и удалить все кеши одним вызовом.

Проблема в том, что я не знаю, как получить доступ к другим фабрикам внутри моего модуля. Так, например, если я создам модуль CacheCentralApp и объявлю в нем фабрики, которые предоставляют cacheFactory, как я могу создать там функцию, которая вызывает removeAll() для каждого cacheFactory?


person CodyBugstein    schedule 29.01.2015    source источник


Ответы (2)


Я не думаю, что возможно нацелиться на все фабрики определенного модуля. Однако я думаю, что другим решением вашей проблемы является отправка события о том, что все фабрики должны быть очищены. Это предотвратит необходимость перебирать все ваши фабрики и вызывать функцию .clear() для всех.

Вы можете отправить запрос события со следующим кодом:

$scope.$broadcast('clearAllCaches');    

И слушайте это событие на каждом заводе вместе с:

$scope.$on('clearAllCaches', function() {
    clearCache();
}
person Ricconnect    schedule 29.01.2015
comment
Интересная идея... но вы уверены, что $scope работает внутри фабрик? - person CodyBugstein; 29.01.2015
comment
Внутри фабрик вам нужно будет внедрить $rootScope и подписаться с помощью $rootScope.$on - person Ricconnect; 29.01.2015

В отдельном модуле вы можете создать для этого фабрику:

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 или другую библиотеку, чтобы убедиться, что ваш код работает.

person Cracker    schedule 29.01.2015
comment
Классная идея, попробую! - person CodyBugstein; 29.01.2015