Javascript 无法在Backbone.localStorage插件中设置初始收集数据
我正在使用并拥有以下收藏:Javascript 无法在Backbone.localStorage插件中设置初始收集数据,javascript,backbone.js,local-storage,backbone.js-collections,Javascript,Backbone.js,Local Storage,Backbone.js Collections,我正在使用并拥有以下收藏: var PlayersCollection = Backbone.Collection.extend({ model: Player, localStorage: new Backbone.LocalStorage("players-backbone"), }); col.localStorage.records // [] nothing 并尝试使用以下方法设置初始数据: var col = new PlayersCollection([ {
var PlayersCollection = Backbone.Collection.extend({
model: Player,
localStorage: new Backbone.LocalStorage("players-backbone"),
});
col.localStorage.records // [] nothing
并尝试使用以下方法设置初始数据:
var col = new PlayersCollection([
{
"model": "myapp.person",
"pk": 1
},
{
"model": "myapp.person",
"pk": 2
}
]);
但不幸的是,我的收藏中没有上述物品:
var PlayersCollection = Backbone.Collection.extend({
model: Player,
localStorage: new Backbone.LocalStorage("players-backbone"),
});
col.localStorage.records // [] nothing
如何基于初始收集数据初始化localStorage store?好的,首先想到的是,Backbone.localStorage仅通过“sync”请求加载数据。这意味着,即使localStorage中存在数据,也需要调用col.fetch(),然后才能将该数据设置到集合中 对于您的特定示例,此解决方案就足够了。但是,它有自己的一套警告,如果您能够扩展您的需求,我很乐意解决这些警告:
var PlayersCollection = Backbone.Collection.extend({
localStorage: new Backbone.LocalStorage("players-backbone"),
initialize: function(){
// NOTE: Models are NOT set on Collection in initialize. Defer until ready.
_.defer(function(){
if(!this.isEmpty()){
this.invoke('save');
this.fetch();
}
}.bind(this));
});
var col = new PlayersCollection([
{
"model": "myapp.person",
"pk": 1
},
{
"model": "myapp.person",
"pk": 2
}
]);
col.once('sync', function(){
console.log('col:', col.localStorage.records);
});
显然,这里的主要问题是:
- 不直观的事件驱动初始化。这可以通过让一个工厂负责创建PlayerCollection来解决,或者通过为该集合提供另一个需要在初始化后运行的方法来解决。所有的解决方案都有点难看
- 修改现有的本地存储数据。通过告诉集合在加载时保存,您将最终修改localStorage中已有的内容。这可以通过检查空集合来解决。但是,您可能仍然会有一些意外的结果
然而,我主要关心的是,当您的集合已经获得了它的模型时,为什么您需要从localStorage中提取。为什么不直接访问col中的模型而不是查询其记录?我假设Backbone.LocalStorage是?是的。刚刚添加到post@Erik您既不保存也不获取模型,因此不应以任何方式考虑您的存储。你希望自动同步吗?