2013-07-07 2 views
0

Я пытаюсь вложить представление коллекции в представление модели.Инициализация вложенных коллекций с помощью Backbone

Для того, чтобы сделать это, я Магистральная в кукловодов Composite View и followed that tutorial

В конце концов, он инициализирует вложенное представление коллекции как это:

MyApp.addInitializer(function(options){ 
    var heroes = new Heroes(options.heroes); 

    // each hero's villains must be a backbone collection 
    // we initialize them here 
    heroes.each(function(hero){ 
    var villains = hero.get('villains'); 
    var villainCollection = new Villains(villains); 
    hero.set('villains', villainCollection); 
    }); 

    // edited for brevity 

}); 

Как бы вы сделать то же самое без используя addInitalizer от Marionette?

В моем проекте я искажаю данные с сервера. И когда я пытаюсь сделать что-то вроде:

App.candidatures = new App.Collections.Candidatures; 

App.candidatures.fetch({reset: true}).done(function() { 
    App.candidatures.each(function(candidature) { 
     var contacts = candidature.get('contacts'); 
     var contactCollection = new App.Collections.Contacts(contacts); 
     candidature.set('contacts', contactCollection); 
    }); 
    new App.Views.App({collection: App.candidatures}); 


}); 

я получаю «indefined варианты», поступающие из коллекции:

App.Collections.Contacts = Backbone.Collection.extend({ 
model: App.Models.Contact, 

initialize:function(models, options) { 
    this.candidature = options.candidature; 
}, 


url:function() { 
    return this.candidature.url() + "/contacts"; 
} 
)}; 

ответ

0

Это потому, что, когда вы создаете contactCollection, вы не обеспечивая candidatures коллекции в объекте options. Вам нужно изменить свой контактный код инициализации коллекции, чтобы что-то вроде:

initialize:function(models, options) { 
    this.candidature = options && options.candidature; 
} 

Таким образом, атрибут candidature будет установлен предоставленному значения (и, если не предусмотрено, это будет undefined).

Затем, вы все равно должны предоставить информацию, когда вы instanciating коллекции:

App.candidatures.each(function(candidature) { 
    var contacts = candidature.get('contacts'); 
    var contactCollection = new App.Collections.Contacts(contacts, { 
     candidature: candidature 
    }); 
    candidature.set('contacts', contactCollection); 
}); 

P.S .: Я надеюсь, что вы нашли мой блог полезным!

+0

Hi David! Очень приятно получить от вас ответ! Ваш пост действительно замечательный! Я понимаю, что кандидатура уже установлена ​​... но я не могу получить данные :(Даже модификация по вашему предложению. Контактная модель – user2167526

+0

Извините, я немного неправильно прочитал ваш код. Я обновил свой ответ. –

+0

Спасибо за ответ! Я думаю, что я становлюсь ближе (после 1 недели на этом!). Но теперь, если в кандидатуре View (первый уровень) я делаю console.log (this.model.get ('contacts')), я получаю пустые объекты ... Может быть, какая-то асинхронная вещь мне не хватает :( – user2167526

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