Я предполагаю, что вы получаете список категорий / элементов в 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!");
}
});