我的模型有一个index
属性,默认为null
,但在添加到集合时应由集合设置。这是我第一次想到的,但没有用。
var model = Backbone.Model.extend({
defaults: {
index: null,
// ...
},
// ...
});
var collection = Backbone.Collection.extend({
// ...
add: function(model) {
model.set({ index: this.size() });
return model;
},
comparator: function(model) {
return model.get('index');
},
// ...
});
然而,这不起作用。它会抛出错误TypeError: model.set is not a function
。我有什么正确的方法或选项?
答案 0 :(得分:3)
您不应该为此实际覆盖add
方法。
The documentation states只要向其添加模型,就会在集合上触发add
事件。你可以听这个事件并做你需要做的事。
在event catalog中,您可以看到add
事件处理程序将接收添加的模型作为第一个参数,因此您可以执行以下操作:
var collection = Backbone.Collection.extend({
initialize: function() {
this.on('add', function (model) {
model.set({ index: this.size() });
}, this);
},
//...
});
如果您还想在传递给构造函数的模型上运行它,请执行以下操作:
var collection = Backbone.Collection.extend({
initialize: function(models) {
_(models).each(function (model, i) {
model.set({ index: i });
});
this.on('add', function (model) {
model.set({ index: this.size() });
}, this);
}
});