2012-03-28 8 views
10

У меня есть две скелетные модели, загруженные с сервера:Магистральная JS комплексная модель выборки

var Model = Backbone.Model.extend({}); 
var SubModel = Backbone.Model.extend({}); 

var SubCollection = Backbone.Collection.extend({ 
    model: SubModel 
}); 

var m = new Model(); 
m.fetch({success: function(model) 
{ 
    model.submodels = new SubCollection(); 
    model.submodels.url = "/sub/" + model.get("id"); 
    model.submodels.fetch(); 
}}); 

Таким образом, сервер должен отправить два отдельных ответов. Например:

{ name: "Model1", id: 1 } // For Model fetch 

и

[{ name: "Submodel1", id: 1 }, { name: "Submodel2", id: 2 }] // For Submodel collection fetch 

Есть ли способ, чтобы принести экземпляр модели с коллекцией подмодели сразу, как:

{ 
    name: "Model1", 
    id: 1, 
    submodels: [{ name: "Submodel1", id: 2 }, { name: "Submodel1", id: 2 }] 
} 

ответ

11

Чтобы быть в состоянии сделать это до для вашего back-end - на самом деле это не имеет ничего общего с Backbone.

Можете ли вы настроить свою внутреннюю технологию для возврата связанных моделей в виде вложенных ресурсов?

Если фоновым является Rails, например, и ваши модели связаны в ActiveRecord, один из способов сделать это что-то вроде

respond_to do |format| 
    format.json { render :json => @model.to_json(:include => [:submodels])} 
end 

Что фоновым технологии вы используете?

Edit:

К сожалению, не понял суть вашего вопроса, как только вы получили Админцетр, возвращая JSON в правильном формате, да, есть вещи, которые нужно сделать в позвоночником быть в состоянии справиться с этим.

Магистральная-реляционная

Один из способов борьбы с ним использовать Backbone-Relational, плагин для обработки связанных моделей.

определяется родственные модели через свойство «отношения»:

SubModel = Backbone.RelationalModel.extend({}); 

SubCollection = Backbone.Collection.extend({ 
    model: SubModel 
}); 

Model = Backbone.RelationalModel.extend({ 
    relations: [ 
    { 
     type: 'HasMany', 
     key: 'submodels', 
     relatedModel: 'SubModel', 
     collectionType: 'SubCollection' 
    } 
    ] 
}); 

Когда модель выбирает JSON, он автоматически создаст подколлекцию под свойством «подмоделями» и заселить его с Подмоделью - по одному для каждого JSON в массиве.

jsfiddle для позвоночника-реляционные: http://jsfiddle.net/4Zx5X/12/

Рукой

Вы можете сделать это вручную, если вы хотите, как хорошо. В переопределяю функцию parse для класса модели (простите, если мой JS не 100% правильно - делали CoffeeScript так много в последнее время его зашит в моем мозге)

var Model = Backbone.Model.extend({ 
    parse: function(response) { 
    this.submodels = new SubCollection(); 
    // Populate your submodels with the data from the response. 
    // Could also use .add() if you wanted events for each one. 
    this.submodels.reset(response.submodels); 
    // now that we've handled that data, delete it 
    delete response.submodels; 
    // return the rest of the data to be handled by Backbone normally. 
    return response; 
    } 
}); 

разобрана() запускается до инициализации() и перед установкой хэша атрибутов, поэтому вы не можете получить доступ к параметрам model.attributes, а model.set() не удается, поэтому мы должны установить коллекцию как прямое свойство модели, а не как «свойство», которое вы будет доступ с помощью get/set.

В зависимости от того, что вы хотите совершить на «save()», вам может потребоваться переопределить `toJSON ', чтобы ваша сериализованная версия модели выглядела так, как ожидает ваш API.

jsfiddle:

http://jsfiddle.net/QEdmB/44/

+0

хорошо ... фоновый ручная работа CPP (и нет способа изменить его Rails или Django) :), но, насколько я понял, ваше решение будет форматировать ответ, как JSON, данный в моем вопросе ... поэтому, магистраль не будет интерпретировать объекты в массиве «подмоделей» как подмодели ... я прав? –

+0

Вариант с базой-реляцией не работает корректно, потому что массив «подмоделей» становится массивом объектов, а не SubModels, я немного проверил вашу скрипку, посмотрите, пожалуйста, http://jsfiddle.net/4Zx5X/3/ –

+0

Хорошо, я попробую по настоящему ajax-запросу. В любом случае, спасибо за подробный ответ! –

 Смежные вопросы

  • Нет связанных вопросов^_^