5

LocalStorageでBackbone.jsを使用する際の非常に短い質問:

LocalStorageに物事のリスト(バックボーンコレクション)を保存しています。私のウェブサイトが複数のブラウザウィンドウ/タブで開いていて、両方のウィンドウのユーザーがリストに何かを追加すると、一方のウィンドウの変更がもう一方のウィンドウで行われた変更を上書きします。

自分で試してみたい場合は、Backbone.jsTodoアプリの例を使用してください。

  1. 2つのブラウザタブでhttp://backbonejs.org/examples/todos/index.htmlを開きます
  2. 最初のタブにアイテム「item1」を追加し、2番目のタブに「item2」を追加します
  3. 両方のタブを更新します。「item1」が消え、「item2」のみが残ります。

これを防ぐ方法、これに対処するための標準的な方法はありますか?

Thxx

4

3 に答える 3

4

問題は、よく知られている同時実行性の更新の喪失の問題です。同時実行制御の更新の喪失を参照してください。。あなたの理解のために、私は次の迅速で汚い修正、ファイル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));
}

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(","));
}
于 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

新しい変更を永続化する前に変更をチェックすることについてのYaroslavのコメントは、1つの解決策ですが、私の提案は異なります。localStorageは、保持しているデータを変更するアクションを実行するときにイベントを発生させることができることに注意してください。それらのイベントにバインドし、各タブでそれらの変更をリッスンし、発生後に再レンダリングを表示します。

次に、一方のタブで削除または追加を行って次のタブに移動すると、イベントが取得され、もう一方のタブで発生したことを反映するように変更されます。私がタブごとに見ているものに奇妙な矛盾はありません。

追加の途中で何かを失くさないように(たとえば、やることリストに新しいエントリを入力し始めた場合)、別のタブに切り替えて何かを削除してから、何かを削除することを検討してください。戻ってきてエントリが消えるのを見たいのですが、部分的に入力した新しいアイテムはまだ利用できるはずです。

于 2012-06-07T14:38:26.360 に答える