【问题标题】:Initializing nested collections with Backbone使用 Backbone 初始化嵌套集合
【发布时间】:2013-07-07 17:31:15
【问题描述】:

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

为此,我使用了 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";
}
)};

【问题讨论】:

    标签: backbone.js initialization marionette


    【解决方案1】:

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

    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.:希望我的博文对你有用!

    【讨论】:

    • 嗨大卫!很高兴在这里得到您的答复!你的帖子真的很棒!我了解 candidature.contacts 已经设置...但我无法检索数据:(甚至根据您的建议进行修改联系人模型
    • 感谢您的回复!我想我越来越近了(经过 1 周!)。但是现在如果在候选视图(第一级)中,我会执行 console.log(this.model.get('contacts'));我得到空对象......也许我错过了一些异步的东西:(
    • 是的,这可能是因为您尝试获取数据时尚未返回数据。不过,您应该会在 Firebug 控制台中看到 APi 调用(以查看您的应用程序是否正常工作)。您可以通过在视图的初始化程序中添加侦听器来刷新视图(例如,侦听集合的“更改”事件。您还可以在每次获取联系人时触发集合的更改事件)。要了解等待异步数据,请查看davidsulc.com/blog/2013/04/01/…
    • 非常感谢您的帮助。在包含大量非常庞大的代码后,我终于确定了它。但它正在工作!谢谢先生,我很喜欢你;)
    • 天哪! N'oublie pas de valider la réponse si elle a été utile ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    相关资源
    最近更新 更多