我假设你接收JSON类别/项目列表,看起来像这...
{
'id': 1,
'name': 'My 1st Category',
'children': [
{
'id': 2,
'name': 'My 2nd Category',
'children': []
},
{
'id': 1,
'name': 'An Item',
'price': 109.99
}
]
}
Backbone.js的没有任何关系了,它支持一个集合多种型号的方块,但它也不会对你把一个集合中的类型的模型任何限制。
在集合定义中指定模型类型只做一件事,它让Backbone知道如果将原始JSON传递给集合而不是Backbone.Model
对象时要创建的模型类型。如果您将Item
模型添加到已包含几个Category
模型的集合中,Backbone将不会将其弹出到模型列表中;它不做任何类型检查。因此,考虑到这一点,除了传递原始JSON之外,您几乎可以使用集合提供的所有内容;你需要自己处理。所以你的选择是事先建立你的模型,使它们成为Backbone.Model
对象,或者创建一些可以为你解析的东西。
对于第二个选项,解析器,我建议将一个特殊的变量传递给包含原始JSON的集合,然后在你的initialize
函数中处理它。这里有一个例子:
var CategoryCollection = Backbone.Collection.extend({
initialize: function(m, models) {
_.each(models, function(model) {
var modelObject = null;
if (model.price !== undefined) {
modelObject = new Item(model);
} else {
modelObject = new Category(model);
}
this.add(modelObject);
}, this);
}
});
所以这是一个有点哈克,但你确定模型的基础上,类型,如果有(在我的例子price
)的特定字段,创建模型对象,然后添加到采集。
你会然后调用它是这样的:你有
var myCollection = new CategoryCollection([], myJSON);
通知传递一个空数组作为第一个参数,因为这就是你怎么正常通过一组模型到集合中。
使用集合时上以后,就可以判断,如果你有Item
或Category
处理使用简单instanceof
检查:
_.each(myCollection.models, function(model) {
if (model instanceof Item) {
console.log("It's an Item! Price: ", model.get("price"));
} else {
console.log("It's a Category!");
}
});
总之,我会说,“我不明白为什么不”,但我很好奇别人会说什么。 – JayC 2012-01-19 19:17:21