【发布时间】:2012-12-18 06:41:30
【问题描述】:
我认为我正在做一些非常标准的事情。
型号:
app.model.Todo = Backbone.Model.extend({
defaults: {
task: ''
, completed: 0
, attachments: []
, note: ''
}
});
收藏:
var Todos = Backbone.Collection.extend({
model: app.model.Todo
, localStorage: new Store('Todos')
, incomplete: function () {
return this.filter(function (todo) {
return !todo.get('completed')
});
}
, complete: function () {
return this.filter(function (todo) {
return todo.get('completed')
});
}
, comparator: function(todo) {
return todo.get('order');
}
});
app.collection.Todos = new Todos();
那么,如果我这样做:
app.collection.Todos.create({task: 'hi'});
app.collection.Todos.create({task: 'hi'});
第二个永远不会工作。我得到一个无限循环(Firefox 上的递归过多,Chrome 上的 stack_overflow 太多)。
我真的很茫然。我也注释掉了所有事件。
似乎它在主干中失控:
// Return a copy of the model's `attributes` object.
toJSON: function(options) {
return _.clone(this.attributes);
},
更新:如果我将 id: 0 或任何 id 添加到模型中,错误就会停止,但如果我给它一个自定义 ID(即 new Date().getTime() 错误再次发生。就像每当我创建一个独特的项目时它就会爆炸.
更新 2:
var todo = new gator.model.Todo({task: actionbarVal});
gator.collection.Todos.add(todo);
gator.collection.Todos.sync('create', todo);
做上述有点工作,我需要它来工作,但它真的很糟糕。这很糟糕,因为每次我们执行新的添加和同步时,它都会在此页面加载时每次调用添加和同步时调用 toJSON 1 次。因此,如果添加 3 个项目,您将获得 6 个 toJSON 调用(第一个调用 1 个,第二个调用 2 个,第三个调用 3 个)。而且,也不是很干净。我还注意到在骨干网this.attributes 的toJSON 调用中,第一次创建是正确的。第二次就像 this.attributes == 骨干之类的。非常非常奇怪。它具有 Backbone 的所有方法。就好像克隆做了一个深度克隆什么的。
【问题讨论】:
-
恐怕我在documentation 中找不到models 的
create,它只存在于collections。跨度> -
如果您在集合上调用 create 似乎可以正常工作:jsfiddle.net/ambiguous/8Szgv PS:如果您的
defaults中有一个数组(或其他可变对象),那么您应该使用默认函数而不是比一个对象。 -
@Cyclone 该死的,我的错。那是一种类型。我的意思是一个集合。固定。
-
@OscarGodson 以了解 SO 的未来清洁度,您能否将解决方案粘贴为对此的答案,以免它看起来没有答案/已解决。 :)
-
@muistooshort 我不知道 :( 我几乎删除了所有代码,但它仍在发生。我删除了默认值。我的集合只是设置了一个模型,localStorage 然后
app.collections.Todos = new Todos()和“app.js”只有 app ={model: {}, collection: {}, view: {}}和window.app = app;
标签: javascript backbone.js infinite-loop