2012-12-20 32 views
5

Vì vậy, điều này hơi lạ. Tôi đang sử dụng Backbone và Backbone.localStorage để lưu dữ liệu từ xa vào bộ nhớ cục bộ để lưu vào bộ nhớ đệm. Công cụ khá chuẩn.Sau khi rõ ràng, localStorage nhớ giá trị trước đó

Khi tôi chạy localStorage.clear() trên toàn bộ cửa hàng, tất cả các giá trị sẽ bị xóa vĩnh viễn ngoại trừ khóa có chuỗi giá trị chuỗi. Nó sẽ bị xóa trong lần kiểm tra đầu tiên, nhưng sau đó khi lưu trữ lưu lại với Backbone.LocalStorage.sync('create', model); các giá trị trước đó sẽ trở lại trong đó.

Tất nhiên, nếu tôi xóa khóa theo cách thủ công trong Công cụ dành cho nhà phát triển Chrome, thì nó sẽ biến mất và không được điền lại. Nó giống như cuộc gọi localStorage.clear() vẫn lưu trữ các khóa bằng một chuỗi ký tự. Tôi đã xác nhận ban đầu nó đã bị xóa khi khởi động ứng dụng.

Tôi sẽ đăng một số mã và ảnh chụp màn hình ở đây để chỉnh sửa, nhưng thực sự nó khá chuẩn, ngoại trừ thực tế các giá trị đó vẫn giữ nguyên sau khi khóa được điền lại. Có ý tưởng nào ở đây không?

EDIT: Rất nhiều mã thú vị để xem xét:

Bộ sưu tập:

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

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

mẫu:

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; 

điều khiển chức năng nào công việc:

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

Bằng cách, localStorage.clear() cuộc gọi là trong ứng dụng bắt đầu. Nó thực hiện một cuộc gọi API để xem phiên bản trên máy chủ có thay đổi hay không. Nếu phiên bản đã thay đổi, sau đó chúng tôi sẽ lưu trữ localStorage.

+0

là nó giống nhau ở tất cả các trình duyệt http://jsfiddle.net/ Antonimo/EVUHy/ – Hontoni

+11

Bạn đang xóa nó bằng 'localStorage.clear()' gốc nhưng viết vào localStorage với 'Backbone.LocalStorage.sync', giả định của tôi sẽ là Backbone đang giữ một bản sao của dữ liệu trong bộ nhớ của nó, nó không biết bạn đã xóa localStorage bằng cách sử dụng phương thức native để nó viết mọi thứ trở lại localStorage khi '.sync' được gọi.' localStorage.clear() 'được gọi trong" app start ", là trước khi Backbone được khởi tạo Nếu Backbone tải trước khi bạn gọi nó, nó có lẽ đã đọc dữ liệu từ localStorage vào bộ nhớ của nó tại điểm đó. –

+0

mở công cụ chrome dev và xóa bộ nhớ cục bộ. Tài nguyên -> Localstorage – Deeptechtons

Trả lời

1

Thay vì localStorage.clear(), sử dụng:

localStorage.removeItem('userInfo'); 

tôi đã phải đối mặt với cùng một vấn đề trong ứng dụng xương sống của tôi và tôi đã sử dụng cách này để xóa bỏ các giá trị.

Ps:.? Có bạn cần phải xác định tất cả của một biến localStorage của bạn bằng một .. :(.. Nhưng việc này cũng

Các vấn đề liên quan