5

关于将 Backbone.js 与 LocalStorage 结合使用的一个非常简短的问题:

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

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

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

有什么建议可以防止这种情况发生,有什么标准的方法来解决这个问题吗?

谢谢

4

3 回答 3

4

该问题是众所周知的并发丢失更新问题,请参阅并发控制中的丢失更新?. 只是为了您的理解,我可能会提出以下快速而肮脏的修复,文件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));
}

对于最新的 Github 版本的 Backbone localStorage,我认为应该是这样的:

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(","));
}
于 2012-06-07T14:21:39.033 回答
2

您可能想改用 sessionStorage。请参阅http://en.wikipedia.org/wiki/Web_storage#Local_and_session_storage

于 2012-06-07T09:36:30.013 回答
2

雅罗斯拉夫关于在保留新更改之前检查更改的评论是一种解决方案,但我的建议会有所不同。请记住,localStorage 在执行更改其保存的数据的操作时能够触发事件。绑定到这些事件并让每个选项卡侦听这些更改并在发生后重新呈现视图。

然后,当我在一个选项卡中进行删除或添加并移至下一个选项卡时,它会收到一个事件并更改以反映另一个选项卡中发生的事情。我看到的选项卡之间不会有奇怪的差异。

您需要考虑确保我不会丢失正在添加的内容(比如我开始为我的待办事项列表输入一个新条目),切换到另一个选项卡并删除某些内容,然后回来我希望看到条目消失,但我部分输入的新项目应该仍然可供我使用。

于 2012-06-07T14:38:26.360 回答