使用Backbone初始化嵌套集合

时间:2013-07-07 17:31:16

标签: backbone.js initialization marionette

我正在尝试将集合视图嵌套到模型视图中。

为了做到这一点,我使用了Backbone的Marionnette 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

});

如果不使用Marionette的addInitalizer,你会如何做同样的事?

在我的项目中,我正在从服务器中处理数据。当我尝试做类似的事情时:

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});


 });

我收到了来自该系列的“未定义选项”:

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";
}
)};

1 个答案:

答案 0 :(得分:0)

这是因为当您创建contactCollection时,您没有在candidatures对象中提供options个集合。您需要将联系人集合初始化代码修改为:

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

这样candidature属性将被设置为提供的值(如果未提供,则为undefined)。

然后,您仍然需要在实例化集合时提供信息:

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。:我希望你发现我的博客文章很有用!