我假設你接收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