2013-02-23 68 views
3

我想将搜索结果作为缓存存储在localStorage中。将Json存储在localStorage中

我想所有的缓存存储为一个localStorage的值:

localStorage.getItem('search-cache') 

它里面我想有JSON对象,我可以添加属性和retreive他们。 不幸的是,它不起作用,localStorage没有更新json结果(它的值保持为'{}')。

我不是一个javascript专业人士,所以请指导我如何做好。

下面是当前的代码缓存结果:

var query = $(this).val(); 

    var cache = JSON.parse(localStorage.getItem('search-cache')); 

    if (cache == null) { 
     cache = '[{}]'; 
    } 

    if (cache[query] == null) { 

     $.getJSON('/api/guides/search?query=' + query, function (data) { 
      $.each(data, function (index, guide) { 
       $('#results').append('<li class="result-item">' + guide.Name + '</li>'); 
      }); 

      cache[query] = data; 
      localStorage.setItem('search-cache', JSON.stringify(cache)); 
     }); 
    } 
    else { 
     $.each(JSON.parse(localStorage.getItem('search-cache')[query]), function (index, guide) { 
      $('#results').append('<li class="result-item">' + guide.Name + '</li>'); 
     }); 

    } 

回答

3

你你的逻辑有一些漏洞。

var cache = JSON.parse(localStorage.getItem("...")); 
if (cache == null) { cache = "[{}]"; } 

那么,如果项目DID存在,您已将缓存设置为等于该对象。
否则,您已将缓存设置为等于字符串"[{}]"

与其考虑如何构建本地存储,不如考虑如何构建结果列表。

var cache_json = localStorage.getItem("search-cache"), 
    search_cache = JSON.parse(cache_json) || {}; 

var query = $("...").value(); // or whatever 

search_cache[query] = search_cache[query] || { results : [] }; 

var list = $(......) 
list.each(function() { 
    search_cache[query].results.push(/* whatever you want in your array */); 
}); 


cache_json = JSON.stringify(search_cache); 
localStorage.setItem("search-cache", query_json); 
+0

谢谢,它确实工作! 此外,我从你的答案中学到了其他东西 - 语法和javascript的态度。 – 2013-02-23 21:14:55

1

因为,在您的项目search-cache的情况下,没有定义,你的缓存变量的初始化是不正确的。

你应该初始化数组是这样的:测试

if (cache[query] == null) 
然而

if (cache == null) { 
    cache = []; 
    cache[query] = null; 
} 

要满足的条件下,你需要测试它像这样:

if(typeof cache[query] == 'undefined') 
+0

感谢您的修复。我从中学到了东西,但没有成功。 – 2013-02-23 21:09:01

1

缓存是一个对象,而不是一个数组,初始化像缓存= {}的代码 休息似乎是正确的。

+0

不幸的是,它并没有解决问题。 – 2013-02-23 21:08:15

相关问题