2012-12-20 13 views
5

Quindi, questo è un po 'strano. Sto usando Backbone e Backbone.localStorage per salvare i dati remoti nella memoria locale per la memorizzazione nella cache. Roba abbastanza standard.Dopo un chiaro, localStorage ricorda i valori precedenti

Quando si esegue un localStorage.clear() sull'intero archivio, tutti i valori vengono cancellati definitivamente, ad eccezione della chiave con una serie di valori stringa. Viene eliminato per la prima ispezione, ma quando lo spazio di archiviazione viene nuovamente salvato con Backbone.LocalStorage.sync('create', model);, i valori precedenti vengono nuovamente riportati.

Ovviamente, se elimino manualmente la chiave in Chrome Developer Tools, non viene ripopolata. È come se la chiamata localStorage.clear() memorizza ancora le chiavi nella cache con un array di stringhe. Ho confermato che viene inizialmente cancellato all'avvio dell'app.

Inserirò codice e schermate qui in modifica, ma in realtà è piuttosto standard tranne per il fatto che tali valori rimangono dopo la ripopolazione della chiave. Qualche idea qui?

EDIT: Un sacco di codice di divertente da guardare:

Collezione:

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

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

Modello:

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; 

funzione di controllo che fa il lavoro:

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

Dal modo, la chiamata localStorage.clear() è in avvio dell'app. Fa una chiamata API per vedere se la versione sul server è cambiata. Se la versione è cambiata, allora nuke localStorage.

+0

è la stessa in tutti i browser http://jsfiddle.net/ Antonimo/EVUHy/ – Hontoni

+11

Si sta cancellando con il nativo 'localStorage.clear()' ma scrivendo su localStorage con 'Backbone.LocalStorage.sync', la mia ipotesi sarebbe che Backbone stia conservando una copia dei dati nella sua memoria, non sa che hai cancellato localStorage usando il metodo nativo in modo che scriva tutto in localStorage quando viene richiamato '.sync'.' localStorage.clear() 'è chiamato in" app start ", è quello prima che Backbone sia avviato ? Se Backbone viene caricato prima di chiamarlo, probabilmente ha già letto i dati da localStorage nella sua memoria in quel punto. –

+0

aprire gli strumenti di chrome dev e cancellare la memoria locale. Risorse -> Localstorage – Deeptechtons

risposta

1

Invece di localStorage.clear(), utilizzare:

localStorage.removeItem('userInfo'); 

ho affrontato lo stesso problema nella mia applicazione spina dorsale e ho usato questo modo per cancellare i valori.

Ps:.? Sì, è necessario specificare tutte le variabili localStorage uno per uno .. :(.. Ma questo funziona bene

Problemi correlati