Ответ 1
Я предполагаю, что вы получаете список категорий/элементов в 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 не будет проблем с отображением ее в списке моделей; он не проверяет тип.
Таким образом, имея в виду, вы можете использовать почти все, что предлагает коллекция, за исключением передачи его raw 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 an Item! Price: ", model.get("price"));
} else {
console.log("It a Category!");
}
});