javascript - 如何使用 Backbone.js 将多个记录渲染到 html 表中?

标签 javascript backbone.js

var ContractModel = Backbone.Model.extend({
    url:  "${g.createLink(controller:'waiverContract', action:'index')}"
})

var contract = new ContractModel({});
contract.fetch();
var contracts = new Backbone.Collection.extend({
    model: contract
});

var ContractView = Backbone.View.extend({
    initialize: function(){
        this.render();
    },
    render: function() {
        var root = this.$el;
        _.each(this.model, function(item) {
            var row = '<tr><td>' + item + '</td></tr>';
            root.find('tbody').append(row);
        });
        return this;
    }
});

var cView = new ContractView({ model: contract, el: $('#contracts') });

我打开了 Chrome 的开发者工具。如果我在渲染函数中执行 console.log(this.model) ,我可以看到一个困惑的对象,其中两条记录存储在 .attributes 中。但是我得到的不是将两行添加到表中,而是其中的 7. 6 行是对象。 (虽然我在 Chrome 的控制台中看到 9 个子对象)。

这对我来说没有多大意义。任何人都可以帮助我不仅让这个工作,而且理解它吗?我知道一旦我实例化了 cView,render() 就会触发,并且我知道一旦我对模型执行 .fetch() 操作,它就会执行 ajax。但这是我所能理解的极限。

最佳答案

您应该获取并迭代集合,而不是模型。模型是一个“事物”,而集合则包含许多“事物”。假设您将 JSON 格式的数组提取到模型中,它将最终得到“1”、“2”等属性,并且每个属性都只是一个普通的 Javascript 对象,而不是 ContractModel 实例。

以下是重组代码的方法:

var ContractModel = Backbone.Model.extend();
var ContractCollection = Backbone.Collection.extend({
  //ContractModel class, not an instance
  model: ContractModel,
  //Set the url property on the collection, not the model
  url:  "${g.createLink(controller:'waiverContract', action:'index')}"
})

var ContractView = Backbone.View.extend({
  initialize: function(){
    //Bind the collection reset event, gets fired when fetch complets
    this.collection.on('reset', this.render, this);
  },
  render: function() {
    //This finds the tbody element scoped to your view.
    //This assumes you have already added a tbody to the view somehow.
    //You might do this with something like
    //this.$el.html('<table><tbody></tbody></table>');
    var $tbody = this.$('tbody');
    this.collection.each(function(contract) {
      //Add any other contract properties here,
      //as needed, by calling the get() model method
      var row = '<tr><td>' + contract.get('someContractProperty') + '</td></tr>';

      //Append the row to the tbody
      $tbody.append(row);
    });
    return this;
  }
});

//Instantiate collection here, and pass it to the view
var contracts = new ContractCollection();
var cView = new ContractView({
  collection: contracts,
  el: $('#contracts')
});
//Makes the AJAX call.
//Triggers reset on success, and causes the view to render.
//Assumes a JSON response format like:
// [ { ... }, { ... }, ... ]
contracts.fetch();

关于javascript - 如何使用 Backbone.js 将多个记录渲染到 html 表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12322946/

相关文章:

javascript - Javascript 模块之间共享的全局变量

javascript - JointJS - 主干错误无法读取未定义的属性 '_listenerId'

javascript - 如何检测 YouTube 已从注入(inject)的脚本(使用 chrome 扩展)完成视频播放?

javascript - 如何从 angular.element [jqLit​​e] 更改第二/第三等标签的背景

html - backbone.js 图片上传

javascript - 主干网获取相关模型

javascript - 使用 Backbone + Slim + Tuupola 基本身份验证时出现未经授权的错误

jquery - 如何使用 Backbone.js View 绑定(bind)到事件?

javascript - JSEncrypt RSA 2048 加密输出大小

asp.net - 禁用 ASP.NEt Validtor,使其在回发时被禁用