Подтвердить что ты не робот

Заполнение вложенных коллекций родительской моделью

У меня есть следующая модель с вложенной коллекцией

var Mdl = Backbone.Model.extend({
  initialize: function() {

    // collection
    this.col1 = new NestedCollection();

  },
  ...
});

Я хотел бы отправить данные как для модели, так и для моделей в коллекции по одному запросу, выглядя примерно так:

{
  att1: val,
  col1: [{obj1: val}, {...}]
}

Я не знаю, как лучше всего передать данные в запросе вложенной коллекции (col1). Я не могу...

var Mdl = Backbone.Model.extend({
  initialize: function() {
    // collection
    this.col1 = new NestedCollection(this.get('col1');
  },
  ...
});

... потому что во время инициализации называется функция синтаксиса модели, которая не была вызвана, что означает, что атрибут col1 пуст, другое решение, о котором я думал, это прослушивание изменений в родительской модели...

model.bind("change:tags", function() {
  model.col1.refresh(model.get('col1'));
});

однако это решение кажется немного тяжелым и может потенциально нарушить любой

this.col1.bind("add", function() {})

и

this.col1.bind("remove", function() {})

в коллекции.

У кого-нибудь есть представление об "официальном" способе этого?

Спасибо.

4b9b3361

Ответ 1

"Официальным" способом является переопределение метода parse:

http://documentcloud.github.com/backbone/#Model-parse

В вашем конкретном случае, что я, вероятно, сделаю, в методе parse, постройте вложенную коллекцию из данных col1, удалите ее из результатов, а затем передайте результаты. Затем базовая линия преобразует остальные данные в свойства.

Я не пробовал это, поэтому я не уверен на 100%, что он работает:

parse: function(response) {
  this.col1 = new NestedCollection(response.col1);
  delete response.col1
  return response
}

Изменить: 28 ноября 2012

Вред указывает, что это может быть не лучший способ сделать это. Первоначальный ответ был написан довольно давно, и в исходном вопросе было указано, что пользователь хотел, чтобы коллекция была свойством модели (а не атрибутом), но вред имеет то значение, что наличие коллекции как атрибута является более приемлемым способ сделать это в наши дни.

Сегодня вы можете использовать что-то вроде Backbone-Relational для обработки большого количества этого материала для вас или, если вы хотите это сделать и у вас есть коллекция как атрибут модели, вы можете сделать что-то вроде:

Building = Backbone.Model.extend({
    parse: function(response) {
        console.log("Parse Called");
        response.rooms = new Rooms(response.rooms);
        return response;
    }
});
Room = Backbone.Model.extend({});
Rooms = Backbone.Collection.extend({
    model: Room
});

science_building = new Building();

science_building.fetch(
    {success: function(model,resp) {console.log(resp);}}
);

С ответом выборки модели, например:

{ id: 1, 
  name: "Einstein Hall", 
  rooms: [
    {id:101, name:'Chem Lab'},
    {id:201, name:'Physics Lab'},
    {id:205, name:'Bio Lab'}
  ]
}

Результирующая модель здания, которая позволяет:

science_building.get('rooms').get(101).get('name')   // ==> "Chem Lab"

Рабочий пример jsFiddle: http://jsfiddle.net/edwardmsmith/9bksp/