4

検索結果をキャッシュとしてlocalStorageに保存したいと思います。

すべてのキャッシュを1つのlocalStorage値として保存したいと思います。

localStorage.getItem('search-cache')

その中に、プロパティを追加して取得できるJSONオブジェクトが必要です。残念ながら、それは機能せず、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>');
        });

    }
4

3 に答える 3

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);
于 2013-02-23T18:57:12.170 に答える
1

アイテムsearch-cacheが定義されていない場合、キャッシュ変数の初期化が正しくないためです。

次のように配列を初期化する必要があります。

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

テスト時に条件を満たすため

if (cache[query] == null)

ただし、次のようにテストする必要があります。

if(typeof cache[query] == 'undefined')
于 2013-02-23T18:48:28.433 に答える
1

cacheはオブジェクトであり、配列ではありません。cache={}のように初期化してください。残りのコードは正しいようです。

于 2013-02-23T19:04:50.697 に答える