2
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)を実行すると、2つのレコードが.attributesに格納されているオブジェクトの混乱を確認できます。しかし、テーブルに2つの行が追加される代わりに、7.6がオブジェクトになります。(Chromeのコンソールには9つのサブオブジェクトが表示されますが)。

これの多くは私には意味がありません。誰かが私がこれを機能させるだけでなく、それを理解するのを手伝ってくれるでしょうか?cViewをインスタンス化するとすぐにrender()が起動し、モデルに.fetch()を実行するとすぐにajaxが実行されることを知っています。しかし、それは私がこれで理解できることの限界です。

4

1 に答える 1

2

モデルではなく、コレクションをフェッチして反復する必要があります。モデルは1つの「もの」であり、コレクションには多くの「もの」があります。JSON形式の配列をモデルにフェッチしているとすると、最終的には「1」、「2」などのプロパティになり、これらはそれぞれ、ContractModelインスタンスではなく、通常のJavascriptオブジェクトになります。

コードを再構築する方法は次のとおりです。

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();
于 2012-09-07T18:02:09.160 に答える