如何使用backbone.js在同一视图中获取3个集合

时间:2011-12-01 00:57:24

标签: backbone.js

首先抱歉我可怕的英语。这是我第一次使用backbone.js。

我需要渲染一个视图来列出我的产品,但我需要在同一个地方获取带有产品系列和产品类型的2个选择()。

如何在同一视图中获取3个集合?提取是异步的,需要在成功响应时捕获模型,但是在成功方法中,我无法读取响应。我是否需要进行嵌套提取?

  list: function () {

var families = new FamilyList();

families.fetch({
    add: true,
    data: {
        'company_id': 1
    },
    success: function (model, response) {}
});

var types = new TypesList();

types.fetch({
    add: true,
    data: {
        'company_id': 1
    },
    success: function (model, response) {}
});

var pr = new ProductList();

pr.fetch({
    add: true,
    data: {
        'company_id': 1
    },
    success: function (model, response) {}
});

var json_template = {
    "title_list": "Company product manager",
    "types": types.models,
    "families": families.models,
    "products": pr.models,
};

html_content = Mustache.to_html(template_products, json_template);

$("#content").html(html_content);

}

1 个答案:

答案 0 :(得分:0)

您必须在回调函数中渲染视图。您可以侦听集合的重置事件(在获取完成时触发)并触发渲染:

list: function () {

  this.families = new FamilyList();
  this.families.bind('reset', this.render, this);
  this.families.fetch({
    add: true,
    data: {
      'company_id': 1
    }
  });

  this.types = new TypesList();
  this.types.bind('reset', this.render, this);
  this.types.fetch({
    add: true,
    data: {
      'company_id': 1
    }
  });

  this.pr = new ProductList();
  this.pr.bind('reset', this.render, this);
  this.pr.fetch({
    add: true,
    data: {
      'company_id': 1
    }
  });
},

render: function() {
  var json_template = {
    "title_list": "Company product manager",
    "types": this.types.models,
    "families": this.families.models,
    "products": this.pr.models,
  };

  html_content = Mustache.to_html(template_products, json_template);
  $("#content").html(html_content);
}

您应该记住,只要调用list()函数,就可以实例化和绑定集合。您应该考虑使用视图的initialize()函数来创建实例并绑定到它们的事件。参见:

http://documentcloud.github.com/backbone/#Collection-constructor

使用这种方法,列表将呈现3次(每次收集一次)。要优化它,您可以跟踪已完成加载的集合数,并且只有在所有集合回调都已执行时才会呈现。