2012-12-20 35 views
5

तो, यह थोड़ा अजीब है। मैं रीचिंग डेटा को कैशिंग के लिए स्थानीय स्टोरेज में सहेजने के लिए बैकबोन और बैकबोन.लोकल स्टोरेज का उपयोग कर रहा हूं। सुंदर मानक सामान।स्पष्ट होने के बाद, स्थानीय स्टोरेज पिछले मानों को याद करता है

जब मैं पूरे स्टोर पर localStorage.clear() चलाता हूं, तो सभी मानों को उस कुंजी को छोड़कर स्थायी रूप से साफ़ कर दिया जाता है जिसमें मूल्यों की स्ट्रिंग सरणी होती है। यह पहले निरीक्षण पर साफ़ हो जाता है, लेकिन फिर जब स्टोरेज Backbone.LocalStorage.sync('create', model); के साथ फिर से सहेजता है तो पिछले मान वापस आते हैं।

बेशक, यदि मैं मैन्युअल रूप से क्रोम डेवलपर टूल्स के भीतर कुंजी हटा देता हूं, तो यह चला जाता है और दोहराया नहीं जाता है। ऐसा लगता है कि localStorage.clear() अभी भी एक स्ट्रिंग सरणी के साथ कैश कुंजी कॉल करें। मैंने पुष्टि की है कि इसे शुरू में ऐप स्टार्ट पर साफ़ कर दिया गया है।

मैं संपादन पर कुछ कोड और स्क्रीनशॉट पोस्ट करूंगा, लेकिन वास्तव में यह वास्तविक मानक है, इस तथ्य को छोड़कर कि उन मानों को कुंजी के बाद रखा गया है। यहां कोई विचार है?

संपादित करें: मज़ा कोड के बहुत सारे को देखने के लिए:

संग्रह:

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

से रास्ता, localStorage.clear() कॉल ऐप शुरू में है। यह देखने के लिए एक एपीआई कॉल करता है कि सर्वर पर संस्करण बदल गया है या नहीं। यदि संस्करण बदल गया है, तो हम स्थानीय स्टोरेज nuke।

+0

यह सभी ब्राउज़रों में एक ही है http://jsfiddle.net/ एंटोनिमो/EVUHY/ – Hontoni

+11

आप इसे देशी 'localStorage.clear()' के साथ साफ़ कर रहे हैं लेकिन 'Backbone.LocalStorage.sync' के साथ स्थानीय स्टोरेज को लिख रहे हैं, मेरी धारणा यह होगी कि बैकबोन डेटा की एक प्रति अपनी स्मृति में रख रहा है, यह पता नहीं है कि आपने स्थानीय विधि का उपयोग करके स्थानीय स्टोरेज को मंजूरी दे दी है, इसलिए यह सब कुछ वापस स्थानीय स्टोरेज को लिखता है जब '.sync' का आह्वान किया जाता है। 'localStorage.clear()' को "ऐप स्टार्ट" में बुलाया जाता है, यह है कि बैकबोन शुरू होने से पहले यदि बैकबोन इसे कॉल करने से पहले लोड करता है तो संभवतः यह स्थानीय स्टोरेज से डेटा को अपनी याद में पढ़ चुका है उस बिंदु पर। –

+0

क्रोम देव उपकरण खोलें और स्थानीय भंडारण को साफ़ करें। संसाधन -> लोकलस्टोरेज – Deeptechtons

उत्तर

1
localStorage.clear() के बजाय

, का उपयोग करें:

localStorage.removeItem('userInfo'); 

मैं अपने रीढ़ आवेदन में एक ही मुद्दा सामना करना पड़ा है और मैंने मान बाहर खाली करने के लिए इस तरह से इस्तेमाल किया।

पी.एस.:।? हाँ आप एक एक करके अपने LocalStorage चर एक के सभी निर्दिष्ट करने की आवश्यकता .. :(.. लेकिन यह अच्छी तरह से काम करता है

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^