2015-08-05 4 views
8

Существуют ли сценарии, в которых угловое обслуживание будет кэшировать вызовы с помощью переадресации/$ http без явного указания сделать это? Например, у меня есть сервис делает что-то вроде этого:Угловое обслуживание Рестатулярное кэширование

function getSomeThings(){ 
     return Restangular.one('things').get().then(function (thing) { 
      return thing; 
     }); 
    } 

Этой услуга будет вызываться каждый раз, когда страница обновляется (это в UI-маршрутизатор маршрут решимости). Есть ли вероятность, что этот призыв НЕ будет выполняться каждый раз, но будет каким-то образом кэшироваться Angular, без явного ответа на это?

Я знаком с caching explicitly так:

RestangularProvider.setDefaultHttpFields({cache: true}); 

Это не цель. Мой вопрос заключается в том, имеют ли угловые службы некоторую врожденную логику кэширования, и если да, то как ее переопределить.

ответ

18

По умолчанию Restangular не реализует никаких стратегий или сценариев кеширования, вам нужно будет создать свои собственные. Насколько я знаю, те, что вы можете сделать с cache при работе с Restangular:

  1. Вы можете кэшировать все, как вы сказали, но вы могли бы найти себе работать с устаревшими данными, так что будьте осторожны с этим :

    RestangularProvider.setDefaultHttpFields({cache: true}); 
    
  2. Вы можете кэшировать ответ для отдельных запросов, как:

    function getSomeThings(){ 
        Restangular.one('thing', 123).withHttpConfig({ cache: true}).get().then(function (thing) { 
         return thing; 
        }); 
    } 
    
  3. Вы можете включать обычай $cacheFactory экземпляр истекают или недействительные ответы кэшированных при необходимости путем вызова этого: $cacheFactory.get('$http').removeAll()

  4. Вы можете свернуть в своем собственном интерфейсе кэша вместо установки истинного в кэш. Это пример завода, который я использую, чтобы удалить все кэшированные данные всякий раз, когда я посылаю создать, обновления или удалить запрос:

    .factory('HTTPCache', ['Restangular', '$cacheFactory', 
         function(Restangular, $cacheFactory) { 
         var service = {}; 
         var cache; 
    
         // Creates the cache 
         service.init = function() { 
          cache = $cacheFactory('http'); 
          Restangular.setDefaultHttpFields({cache: cache}); 
    
          Restangular.setResponseInterceptor(function(response, operation) { 
           if (operation === 'put' || operation === 'post' || operation === 'remove') { 
            cache.removeAll(); 
           } 
           return response; 
          }) 
         } 
    
         return service; 
    
        }]) 
    
+1

Великий ответ, ти. – VSO

Смежные вопросы