2015-03-24 5 views
0

У меня есть несколько экземпляров настраиваемого древовидного дерева, использующих treestores, которые загружают данные JSON удаленно. Задержка некоторых из этих запросов составляет до 25 секунд.ExtJS - как кэшировать данные дерева

Итак, есть ли способ кэшировать данные после их загрузки для будущего использования?

Я проверил документы, в частности, для LocalStorageProxy, но не смог обработать данные JSON.

спасибо.

ответ

1

Вот прокси, который кэширует свои ответы на основе URL

(function(){ 
    // Key is the url, value is the response from the AJAX request 
    var requestCache = {}; 
    /** 
    * A proxy that caches GET requests. 
    */ 
    Ext.define('Common.proxy.CachingRestProxy', { 
     extend: 'Ext.data.proxy.Rest', 
     alias: 'proxy.cachingrest', 

     statics: { 
      clearCache: function() { 
       requestCache = {}; 
      } 
     }, 

     createCacheKeyFromRequest: function (request) { 
      var url = request.getUrl(); 
      var questionMarkIndex = url.indexOf('?'); 
      var queryString = ''; 
      // Don't want to include the cache buster in the cacheKey 
      if (questionMarkIndex > -1) { 
       queryString = url.substring(questionMarkIndex); 
      } url = url.substring(0, questionMarkIndex); 
      var queryStringObj = Ext.Object.fromQueryString(queryString); 
      delete queryStringObj[this.cacheString]; 
      var params = Ext.apply(queryStringObj, request.getParams()); 
      return url + JSON.stringify(params); 
     }, 

     // Overridden to use GET requests from the cache if available 
     sendRequest: function(request) { 
      // The cacheKey is just a non readable string that includes all the data that makes up a unique rest call, 
      // including the url and the param keys and values. 
      var cacheKey = this.createCacheKeyFromRequest(request); 
      var cachedResponse = requestCache[cacheKey]; 
      if(cachedResponse){ 
       this.processResponse(true, request.getOperation(), request, cachedResponse); 
       return request; 
      } else { 
       return this.callParent([request]); 
      } 
     }, 

     // Overridden to cache GET responses 
     processResponse: function(success, operation, request, response) { 
      this.callParent(arguments); 
      if (success && this.getMethod(request).toUpperCase() == 'GET'){ 
       requestCache[this.createCacheKeyFromRequest(request)] = response; 
      } 
     } 
    }); 
})(); 

И вы просто использовать его, как вы бы RestProxy

proxy: { 
    type: 'cachingrest', 
    url: '/compose/api/v1/vocabularies', 
    ... 

}

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