2013-03-23 9 views
5

Utworzyłem usługę przy użyciu CacheFactory. Spodziewałem się, że będzie to singleton. Wstrzykuję go do kontrolera i działa dobrze w zasięgu kontrolera. Ale gdy przejdę na inną stronę z innym zakresem, wydaje się, że nie mam wartości w pamięci podręcznej, które zapisałem w tym samym kontrolerze w innym zakresie. Czy zachowanie właściwości CacheFactory nie powinno być pojedynczym miejscem, w którym mam te same obiekty w pamięci podręcznej wszędzie, gdzie wstrzykiwam usługę CacheService?Czy CacheFactory w angularjs jest singleton?

To jest mój serwis jako przykład:

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

Wtedy w moim kontrolera:

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

Odpowiedz

16

$cacheFactory nie jest w rzeczywistości usługa chcesz używać - to fabryka, która służy do stwórz usługę singleton, której chcesz użyć. Przyglądając się twojemu kodowi, wygląda na to, że powinien zadziałać. Ale poszedłem dalej i stworzyłem demo, aby udowodnić, że tak jest. Oto usługa:

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

    return cache; 
}); 

W tym przykładzie CacheServicejest singleton, który ma lokalnej pamięci podręcznej utworzony z $cacheFactory, która jest co wracamy ze służby. Możemy to wprowadzić do dowolnego kontrolera, który chcemy i zawsze będzie zwracał te same wartości.

Oto Plunker pracy: http://plnkr.co/edit/loKWGms1lMCnmiWa1QA7?p=preview


Jeśli z jakiegoś powodu Twój post nie zawiera co złamał kod, prosimy zaktualizować Plunker aby go złamać i możemy go stamtąd.

+0

Dzięki Josh. Twój przykład działa. A teraz, gdy przyjrzę się bliżej, moje też. Gdzie to nie działa, to jeśli odświeżam przeglądarkę. Które teraz, że myślę o tym, prawdopodobnie ma sens, ponieważ ponownie ładuję angulary po odświeżeniu przeglądarki. Więc w takim razie prawdopodobnie ma sens, że nie będę już miał wartości w pamięci podręcznej zgodziłbyś się? – DavidB

+1

Tak, stan jest w całości powiązany z bieżącym ładowaniem strony. AngularJS (i wszystkie frameworki MVC po stronie klienta) są przeznaczone do stosowania w aplikacjach jednostronicowych (choć nie są do nich ograniczone). Ale możesz użyć pamięci lokalnej, aby przetrwać, jeśli potrzebujesz. Musisz sam napisać tę usługę. –

Powiązane problemy