Является ли CacheFactory в angularjs синглтоном?

Я создал службу, используя 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');
}

person DavidB    schedule 23.03.2013    source источник


Ответы (1)


$cacheFactory на самом деле не та служба, которую вы хотите использовать, а фабрика, которую вы используете для создания единственной службы, которую вы хотите использовать. Глядя на ваш код, кажется, что он должен работать. Но я пошел дальше и создал демо, чтобы доказать, что это так. Вот служба:

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

   return cache;
});

В этом примере CacheService является синглтоном с локальным кешем, созданным с помощью $cacheFactory, который мы возвращаем из службы. Мы можем внедрить это в любой контроллер, который захотим, и он всегда будет возвращать одни и те же значения.

Вот рабочий планкер: http://plnkr.co/edit/loKWGms1lMCnmiWa1QA7?p=preview


Если по какой-то причине ваш пост не содержит того, что сломало ваш код, пожалуйста, не стесняйтесь обновить мой Plunker, чтобы сломать его, и мы можем двигаться дальше.

person Josh David Miller    schedule 23.03.2013
comment
Спасибо, Джош. Ваш пример работает. И теперь, когда я присматриваюсь, мой тоже. Где это не работает, если я обновляю браузер. Что теперь, когда я думаю об этом, вероятно, имеет смысл, потому что он снова загружает angularjs, когда я обновляю браузер. Так что в этом случае, вероятно, имеет смысл, что у меня больше нет значений в кеше, вы согласны? - person DavidB; 23.03.2013
comment
Да, состояние полностью привязано к текущей загрузке страницы. AngularJS (и все клиентские MVC-фреймворки) предназначены для использования в одностраничных приложениях (хотя они ими не ограничиваются). Но вы можете использовать локальное хранилище для сохранения, если вам нужно. Вам просто нужно написать сервис самостоятельно. - person Josh David Miller; 23.03.2013