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

Магистраль - коллекции, вложенные в модели

Можно ли встраивать коллекции в модели?

Я знаю, что вы можете создавать новые коллекции при инициализации обратного вызова модели и создавать ссылки, которые вы можете передавать назад и вперед между коллекцией и родительской моделью. Но возможно ли установить коллекцию как часть модели, так что экспортируемый ею JSON выглядит следующим образом:

{
  blah: 'blah',
  myCollection: [
      {
         foo: 'asdf',
         bar: 'qwer'
      },
      {
         foo: 'asdf123',
         bar: 'qwer123'
      }
  ]
}

Если нет, как вы справляетесь с синхронизацией модели с соответствующими сборками с бэкэнд? Вам нужно подключиться к базовой синхронизации и перестроить JSON или есть что-то более плавное?

Извините, если на этот вопрос был дан ответ в другом месте. Я осмотрелся и увидел некоторые обходные пути, но ничего не ответил на то, что я ищу.

4b9b3361

Ответ 1

Существует два подхода. Во-первых, это определить корневую модель, которая получает все. Вы переопределите метод parse() для создания подкатегорий и подмоделей для вложенных атрибутов и переопределите метод toJSON() для преобразования обратно в структуру JSON, подходящую для сохранения на сервере.

Это вполне приемлемо для небольших подкомпонов. Это требует немного программирования, но если вы можете прочитать исходный код Backbone, то как это сделать, должно быть, ну, не очевидно, но, по крайней мере, понятно.

Или вы можете использовать Backbone Relational, который выполняет всю вашу работу.

Ответ 2

Ренато был близок, но "имеет" и "установить" еще не будет доступен. Я считаю, что Reckoner указал на это. Кроме того, вам нужно будет удалить свойство из ответа, иначе оно переопределит значение по умолчанию.

_.extend(Backbone.Model.prototype, {
    parse: function(resp, xhr) {
        var attr, model, models, collection, options;
        for (var prop in resp) {
            if (this.defaults && this.defaults[prop]) {
                attr = this.defaults[prop];
                if (attr instanceof Backbone.Model) {
                    model = attr.clone();
                    model.set(resp[prop]);
                    resp[prop] = model;
                } else if (attr instanceof Backbone.Collection) {
                    models = attr.map(function (model) { return model.clone(); });
                    options = _.clone(attr.options);
                    collection = new attr.constructor(models, options);
                    collection.add(resp[prop]);
                    resp[prop] = collection;
                }
            }
        }
        return resp;
    }
});

Надеюсь, что это поможет кому-то.