使用多个浏览器选项卡/窗口的backbone.js和本地存储会覆盖数据

use*_*506 5 javascript local-storage backbone.js

关于在LocalStorage中使用Backbone.js的一个非常简短的问题:

我在LocalStorage中存储了一系列内容(Backbone集合).当我的网站在多个浏览器窗口/选项卡中打开并且两个窗口中的用户向列表添加内容时,一个窗口的更改将覆盖在另一个窗口中所做的更改.

如果您想亲自尝试,只需使用示例Backbone.js Todo应用程序:

  1. 在两个浏览器标签中打开http://backbonejs.org/examples/todos/index.html
  2. 在第一个标签中添加项"item1",在第二个标签中添加"item2"
  3. 刷新两个标签:'item1'将消失,您将只剩下'item2'

任何建议如何防止这种情况发生,任何标准的方式来处理这个?

Thxx

Yar*_*lav 4

该问题是众所周知的并发丢失更新问题,请参阅并发控制中丢失更新?。为了您的理解,我可能会建议以下快速而肮脏的修复, file backbone-localstorage.jsStore.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));
}
Run Code Online (Sandbox Code Playgroud)

对于Backbone localStorage 的最新 Github 版本,我认为应该如下所示:

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(","));
}
Run Code Online (Sandbox Code Playgroud)

  • 我编辑了您的回复,以包含适用于最新 Github 版本的 Backbon localStorage 的代码。 (2认同)