这些天我一直在努力学习backbone.js。我是一个模特和一个集合。该模型在其中定义了一些默认属性,我想在集合中获取。这是我的代码:
var model = Backbone.Model.extend({
defaults : {
done : true
}
});
var collection = Backbone.Collection.extend({
model : model,
pickMe : function () {
log(this.model.get('done')); //return undefined
}
});
var col = new collection();
col.pickMe();
如何从集合中调用模型中定义的方法?我在这里做错了吗?
答案 0 :(得分:2)
Backbone的基本设置是:
您的模型是集合的一部分。所以在你的设置中你有一个模型构造函数model
和集合构造函数collection
,但你的集合中没有模型,如果你有任何模型,它们将是一个数组,所以你的代码应该是像这样
var model = Backbone.Model.extend({
defaults : {
done : true
}
});
var collection = Backbone.Collection.extend({
model : model,
pickMe : function () {
for ( i = 0; i < this.models.length; i++ ) {
log(this.models[i].get('done')); // this prints 'true'
}
}
});
// Here we are actually creating a new model for the collection
var col = new collection([{ name : 'jack' }]);
col.pickMe();
您可以在此处查看工作jsFiddle:http://jsfiddle.net/S8tHk/1/
答案 1 :(得分:2)
@erturne是正确的,你试图在模型构造函数上调用方法,而不是模型实例。这没有意义。
如果你真的想在集合上定义方法,那么@drinchev提供了一个如何遍历集合中的模型并调用它们的方法的示例。虽然,这个例子相当笨重 - 使用内置的迭代器方法会更优雅。
根据您要完成的任务,您可能只想使用内置的集合迭代器方法来调用每个模型上的方法,而不是在集合上定义方法。 E.g:
var Model = Backbone.Model.extend({
defaults : {
done : true
}
});
var Collection = Backbone.Collection.extend({
model : Model
});
var col = new Collection([{}, {done : false}, {}]);
col.each(function (model) {
log(model.get('done'));
});
答案 2 :(得分:0)
我认为你最好将模型方法附加到模型本身,而不是集合中。所以你应该有这样的事情:
var model = Backbone.Model.extend({
defaults : {
done : true
},
pickMe : function () {
log(this.get('done'));
}
});
var collection = Backbone.Collection.extend({
model : model,
});
var model = collection.get(id)
model.pickMe()