Да, действительно.
Когда вы вызываете 'fetch' для коллекции, она передает ответ через Backbone.Collection.parse перед добавлением его в коллекцию.
Реализация по умолчанию 'parse' просто пропускает ответ, как есть, но вы можете переопределить его, чтобы вернуть список моделей, которые будут добавлены в коллекцию:
class Logbooks extends Backbone.Collection
model: Logbook
url: 'api/logbooks'
parse: (resp, xhr) ->
_(resp).map (attrs) ->
switch attrs.type
when 'UML' then new UmlLogbook attrs
when 'Plane' then new PLaneLogbook attrs
РЕДАКТИРОВАТЬ: Вау, idbentley добрался до меня. единственная разница в том, что он использовал «каждый», а я использовал «карту». Оба будут работать, но по-разному.
Использование 'each' эффективно разрывает цепочку, которую начал вызов 'fetch' (возвращая 'undefined' - следовательно, последующий вызов 'reset' (или 'add') ничего не сделает) и выполняет всю обработку прямо там в функции разбора.
Использование 'map' просто преобразует список атрибутов в список моделей и передает его обратно в цепочку, которая уже находится в движении.
Различные штрихи.
ВНОВЬ РЕДАКТИРОВАТЬ: только что понял, что есть еще один способ сделать это:
Атрибут 'model' в коллекции существует только для того, чтобы коллекция знала, как создать новую модель, если ей переданы атрибуты в 'add', 'create' или 'reset'. Таким образом, вы можете сделать что-то вроде:
class Logbooks extends Backbone.Collection
model: (attrs, options) ->
switch attrs.type
when 'UML' then new UmlLogbook attrs, options
when 'Plane' then new PLaneLogbook attrs, options
# should probably add an 'else' here so there's a default if,
# say, no attrs are provided to a Logbooks.create call
url: 'api/logbooks'
Преимущество этого заключается в том, что теперь коллекция будет знать, как «разыграть» правильный подкласс журнала для операций, отличных от «извлечения».