Backbone.LocalStorage
のインスタンスは、独自のコード外で発生する変更をlistenするようには設計されていません。そういうわけで、あなたが得ている行動を得ることができます。ただし、回避策があります。
あなたはこのようなコレクションを定義しますlocalStorage
値はA_Collection
のすべてのインスタンスで共有され
var A_Collection = Backbone.Collection.extend({
model: A,
localStorage: new Backbone.LocalStorage("as")
});
を。あなたは、自動的にこのように、Backbone.LocalStorage
の新しいインスタンスを作成することができます。
var A_Collection = Backbone.Collection.extend({
model: A,
initialize: function() {
A_Collection.__super__.initialize.apply(this, arguments);
A_Collection.prototype.localStorage = new Backbone.LocalStorage("as");
},
});
我々は、それがあなたの元のコードと同じ動作ですA_Collection
のすべてのインスタンスで共有されるように、プロトタイプの上に設定する必要があります。これで、A_Collection
の新しいインスタンスを作成するたびにBackbone.LocalStorage
という新しいインスタンスが作成され、LocalStorage
から新たに情報が取得されます。
説明はplunkerです。ここに関連するコードは、参考のために、次のとおりです。
var A = Backbone.Model.extend({
initialize: function() {}
});
var A_Collection = Backbone.Collection.extend({
model: A,
initialize: function() {
A_Collection.__super__.initialize.apply(this, arguments);
A_Collection.prototype.localStorage = new Backbone.LocalStorage("as");
},
});
// Setup a collection.
var collection = new A_Collection();
collection.fetch();
// Clean it out from previous runs... Note that we have to use destroy to destroy all items.
// Reset won't save to LocalStorage.
while (collection.length > 0) {
var model = collection.at(0);
model.destroy();
collection.remove(model);
}
// and set some elements.
collection.create({
name: "1"
});
collection.create({
name: "2"
});
console.log("collection length:", collection.length);
// Mess with it outside the Backbone code.
localStorage.clear();
// Manually create data that looks like what Backbone expects.
localStorage.setItem("as-1", JSON.stringify({
name: "foo",
id: "1"
}));
localStorage.setItem("as-2", JSON.stringify({
name: "bar",
id: "2"
}));
localStorage.setItem("as-3", JSON.stringify({
name: "baz",
id: "3"
}));
localStorage.setItem("as", "1,2,3");
// Create a new collection that loads from LocalStorage
var collection2 = new A_Collection();
collection2.fetch();
console.log("collection 2 length:", collection2.length);
console.log("first item", collection2.at(0).toJSON());
console.log("third item", collection2.at(2).toJSON());
console.log("instance is shared?", collection.localStorage === collection2.localStorage);
上記のコードは、コンソール上でこれを生成します。
collection length: 2
collection 2 length: 3
first item Object {name: "foo", id: "1"}
third item Object {name: "baz", id: "3"}
instance is shared? true
うわー、本当に感動。それが私が探していたものです。どうもありがとうございました – acimutal