2012-12-20 11 views
5

To trochę dziwne. Używam Backbone i Backbone.localStorage do zapisywania danych zdalnych do pamięci lokalnej w celu buforowania. Całkiem standardowe rzeczy.Po wyczyszczeniu localStorage zapamiętuje poprzednie wartości.

Po uruchomieniu localStorage.clear() w całym magazynie wszystkie wartości są usuwane na stałe, za wyjątkiem klucza z tablicą tekstową z wartościami. Zostaje wyczyszczona podczas pierwszej inspekcji, ale gdy pamięć zostanie zapisana ponownie z Backbone.LocalStorage.sync('create', model);, poprzednie wartości są tam ponownie.

Oczywiście, jeśli ręcznie usunę klucz w Narzędziach dla programistów Chrome, zostanie on usunięty i nie będzie ponownie wypełniany. To tak, jakby wywołanie localStorage.clear() nadal buforuje klucze z tablicą ciągów. Potwierdziłem, że jest początkowo wyczyszczony przy starcie aplikacji.

Umieszczę tutaj kod i zrzuty ekranu tutaj, ale naprawdę jest to dość standardowe, z wyjątkiem faktu, że te wartości pozostają po ponownym wypełnieniu klucza. Jakieś pomysły tutaj?

EDIT: Dużo kodu zabawy spojrzeć na:

Kolekcja:

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

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

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; 

funkcja kontrolera, który działa:

 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 }); 
      } 
     }); 

Przez sposób, localStorage.clear() połączenie jest w uruchomieniu aplikacji. Wykonuje wywołanie API, aby sprawdzić, czy wersja na serwerze uległa zmianie. Jeśli wersja się zmieniła, to nuke localStorage.

+0

Jest ona taka sama we wszystkich przeglądarkach http://jsfiddle.net/ Antonimo/EVUHy/ – Hontoni

+11

Jesteś wyczyszczenie go z natywnym 'localStorage.clear()', ale pisząc do localStorage z 'Backbone.LocalStorage.sync', moje założenie byłoby, że trzon jest przechowywanie kopii danych w pamięci, to nie wie, że wyczyściłeś localStorage przy użyciu natywnej metody, więc zapisuje wszystko z powrotem do localStorage po wywołaniu '.sync'' localStorage.clear() 'jest wywoływane w" app start ", to jest zanim inicjuje się Backbone - Jeśli Backbone ładuje się przed wywołaniem, prawdopodobnie odczytał już dane z localStorage w swojej pamięci ten punkt. –

+0

otwórz narzędzia chrome dev i wyczyść magazyn lokalny. Zasoby -> Localstorage – Deeptechtons

Odpowiedz

1

Zamiast localStorage.clear() użyj:

localStorage.removeItem('userInfo'); 

Mam wobec tego samego problemu w mojej aplikacji szkieletowej i użyłem w ten sposób, aby pozbyć się tych wartości.

Ps. Tak trzeba podać wszystkie swoje zmienne localStorage jeden po drugim .. :(.. Ale to działa dobrze

Powiązane problemy