2012-06-07 5 views
5

chỉ là một câu hỏi rất ngắn về việc sử dụng Backbone.js với trữ Cục bộ:backbone.js và lưu trữ địa phương với nhiều tab trình duyệt/cửa sổ ghi đè dữ liệu

Tôi đang lưu trữ một danh sách những thứ (bộ sưu tập Backbone) trong LocalStorage. Khi trang web của tôi mở trong nhiều cửa sổ/tab trình duyệt và người dùng trong cả hai cửa sổ sẽ thêm một thứ gì đó vào danh sách, thay đổi của một cửa sổ sẽ ghi đè các thay đổi được thực hiện trong cửa sổ khác.

Nếu bạn muốn thử cho chính mình, chỉ cần sử dụng các ví dụ Backbone.js Todo ứng dụng:

  1. mở http://backbonejs.org/examples/todos/index.html trong hai tab trình duyệt
  2. Thêm một mục 'ITEM1' trong tab đầu tiên và 'ITEM2 'trong tab thứ hai
  3. Refresh cả tab: 'item1' sẽ biến mất và bạn sẽ được trái với 'ITEM2' chỉ

Bất kỳ lời đề nghị làm thế nào để ngăn chặn điều này xảy ra, bất kỳ cách tiêu chuẩn để de al với điều này?

Thxx

Trả lời

4

Vấn đề là vấn đề cập nhật mất đồng thời nổi tiếng bị mất, xem Lost update in Concurrency control?. Chỉ cần cho sự hiểu biết của bạn tôi có thể đề nghị sửa chữa nhanh chóng và dơ bẩn sau, nộp backbone-localstorage.js, Store.prototype.save:

save: function() { 
    // reread data right before writing 
    var store = localStorage.getItem(this.name); 
    var data = (store && JSON.parse(store)) || {}; 
    // we may choose what is overwritten with what here 
    _.extend(this.data, data); 

    localStorage.setItem(this.name, JSON.stringify(this.data)); 
} 

Đối với latest Github version of Backbone localStorage, tôi nghĩ rằng điều này sẽ trông như thế này:

save: function() { 
    var store = this.localStorage().getItem(this.name); 
    var records = (store && store.split(",")) || []; 
    var all = _.union(records, this.records); 
    this.localStorage().setItem(this.name, all.join(",")); 
} 
+0

Cảm ơn! Chỉ cần gợi ý tôi cần. Tôi biết đó là một loại hack nhưng nó thực hiện một mẹo. – user1151506

+2

Tôi đã chỉnh sửa phản hồi của bạn để bao gồm mã hoạt động với phiên bản Gostub mới nhất của Backbon localStorage. – user1151506

+0

Làm thế nào để bạn đi về việc xóa nó? – Lion789

2

Bạn có thể muốn sử dụng sessionStorage để thay thế. Xem http://en.wikipedia.org/wiki/Web_storage#Local_and_session_storage.

+0

Đây là câu trả lời đúng. Chỉ có một bộ điều hợp lưu trữ cục bộ cho backbone.js, http://backbonejs.org/docs/backbone-localstorage.html bạn sẽ phải viết việc triển khai của riêng bạn để sử dụng session-storage –

+0

Xin lỗi, tôi nên rõ ràng hơn. Những gì tôi muốn là ** localStorage **, vì tôi cần dữ liệu được duy trì giữa các phiên. Chỉ cần lấy danh sách Todo ở trên làm ví dụ: Bạn không muốn danh sách việc cần làm của mình bị xóa khi bạn đóng tab hoặc cửa sổ trình duyệt. Lần sau khi bạn quay lại ứng dụng của mình, bạn muốn nó ở đó. – user1151506

+0

Hãy tưởng tượng bạn đã mở hai cửa sổ, điền đầy đủ dữ liệu vào, đóng cả hai, mở một cái mới. Cái nào trong số đó đã đóng trước đó, nó sẽ lấy dữ liệu từ đâu? Bạn cần ủy quyền chính thức và xác thực sau đó. – Yaroslav

2

bình luận Yaroslav về kiểm tra cho những thay đổi trước khi lưu giữ những cái mới là một giải pháp nhưng đề xuất của tôi sẽ khác. Hãy nhớ rằng localStorage có khả năng kích hoạt các sự kiện khi nó thực hiện các hành động thay đổi dữ liệu mà nó nắm giữ. Liên kết với những sự kiện đó và yêu cầu mỗi tab lắng nghe những thay đổi đó và xem lại sau khi nó xảy ra.

Sau đó, khi tôi xóa hoặc thêm vào một tab và chuyển sang tab tiếp theo, nó sẽ nhận được sự kiện và thay đổi để phản ánh những gì đã xảy ra trong tab khác. Sẽ không có sự khác biệt kỳ lạ trong những gì tôi thấy tab tab.

Bạn sẽ muốn đưa ra một số suy nghĩ để đảm bảo rằng tôi không mất thứ gì đó tôi đang thêm vào (nói bắt đầu nhập một mục mới cho danh sách việc cần làm của tôi), chuyển sang tab khác và xóa một cái gì đó, và sau đó trở lại Tôi muốn nhìn thấy mục nhập biến mất nhưng một phần mới của tôi đánh máy một phần vẫn nên có sẵn cho tôi.

+0

Giải pháp này có trải nghiệm người dùng tốt hơn. – Yaroslav

+0

Giải pháp này có vẻ chính xác hơn và sẽ ít bị hack, đúng hơn! Nhưng nó đi kèm với rất nhiều điều kỳ quặc hoặc thiếu sự hỗ trợ trong IE, Safari và Chrome. Chỉ cần thử nó và nó hoạt động tốt trong FF nhưng không thực sự trong Chrome, đó là lý do tại sao tôi đã đi với hack đã đề cập ở trên. – user1151506