2012-12-20 10 views
5

これはちょっと変です。私はBackboneとBackbone.localStorageを使って、リモートデータをキャッシュ用のローカルストレージに保存しています。かなり標準的なもの。クリア後、localStorageは以前の値を記憶します

ストア全体でlocalStorage.clear()を実行すると、値の文字列配列を持つキーを除き、すべての値が完全にクリアされます。最初の検査ではクリアされますが、ストレージが再びBackbone.LocalStorage.sync('create', model);でセーブされると、以前の値がそこに戻ります。

もちろん、Chromeデベロッパーツール内で手動でキーを削除しても、そのキーは削除されずに残っており、再投入されません。これは、localStorage.clear()コールが文字列配列でキーをキャッシュしているかのようです。私はそれが最初にアプリの開始時にクリアされていることを確認しました。

ここでコードとスクリーンショットを編集に投稿しますが、実際には、キーが再投入された後もこれらの値が残っていることを除いて、かなり標準的です。ここにどんなアイデア?

EDIT:

コレクション:

app.DiagnosisCollection = Backbone.Collection.extend({ 
    model: DiagnosisModel, 
    localStorage: new Backbone.LocalStorage('diagnosis'), 

    save: function(model) { 
     Backbone.LocalStorage.sync('create', model); 
    } 
}); 

モデル:作業を行い

app.DiagnosisModel = Backbone.Model.extend({ 

    urlRoot: app.ApiRoot, 
    url: app.DiagnosisApi, 

    initialize: function(options) { 
     if(!options.query) { 
      throw 'query must be passed to diagnosisModel'; 
     } 

     this.local = false; 
     this._query = options.query; 
    }, 

    sync: function(method, model, options) { 
     var diagnosisKey = localStorage.getItem('diagnosis'); 
     var index, diagnosisStore; 

     if(diagnosisKey) { 
      diagnosisKey = diagnosisKey.split(','); 
     } 

     index = _.indexOf(diagnosisKey, this._query); 

     if(index !== -1) { 
      diagnosisStore = localStorage.getItem('diagnosis' + '-' + diagnosisKey[index]); 
     } 

     if(diagnosisStore) { 
      this.local = true; 
      options.success(JSON.parse(diagnosisStore)); 
     } 
     else { 
      this.local = false; 
      var fetchUrl = this.urlRoot + this.url + this._query; 
      $.getJSON(fetchUrl, function(data, textStatus) { 
       if(textStatus !== 'success') { 
        options.error(); 
       } 
       options.success(data); 
      }); 
     } 
    } 
}); 

return app.DiagnosisModel; 

コントローラー機能:

 var self = this; 

     // Create a new collection if we don't already have one 
     // The save function puts it in local storage 
     if(!this.diagnosisCollection) { 

      this.diagnosisCollection = new DiagnosisCollection(); 

      this.diagnosisCollection.on('add', function(diagModel) { 
       this.save(diagModel); 
      }); 
     } 

     var diagModel = new DiagnosisModel({ 
      query: diagId 
     }); 

     diagModel.fetch({ 
      success: function() { 
       var diagView = new DiagnosisView({ 
        model: diagModel 
       }); 

       if(!diagModel.local) { 
        self.diagnosisCollection.add(diagModel); 
       } 

       self._switchPage(diagView); 
      }, 
      error: function() { 
       console.error("Diag Model Fetch Failed"); 
       Backbone.history.navigate('503', { trigger: true }); 
      } 
     }); 

楽しいコードの多くを見て〜によってway、localStorage.clear()コールはアプリの開始です。サーバー上のバージョンが変更されたかどうかを確認するAPI呼び出しを行います。バージョンが変更されている場合は、localStorageをヌークします。

+0

、それはすべてのブラウザで同じである http://jsfiddle.net/。? Antonimo/EVUHy/ – Hontoni

+11

あなたは 'localStorage.clear()'をクリアしていますが、 'Backbone.LocalStorage.sync'を使ってlocalStorageに書き込んでいます。私の前提は、バックボーンがデータのコピーをメモリに保持しているということです'.sync'が呼び出されたときにlocalStorageにすべてを書き戻すように、ネイティブメソッドを使ってlocalStorageをクリアしたことを知りません。' 'appStart''で' localStorage.clear() 'が呼び出されます。もしあなたがそれを呼び出す前にBackboneがロードされているのであれば、おそらくlocalStorageのデータをすでにメモリから読み込んでいるでしょう。その点。 –

+0

クロム開発ツールを開き、ローカルストレージをクリアします。リソース - > Localstorage – Deeptechtons

答えて

1

代わりのlocalStorage.clear()、使用:

localStorage.removeItem('userInfo'); 

私は自分のバックボーンアプリケーションで同じ問題に直面していると私は値をクリアするには、この方法を使用していました。

シモンズ:はいあなたは:(..あなたのlocalStorage変数一つ一つのすべてを指定する必要があります..しかし、これはうまく機能

関連する問題