2012-02-09 7 views
2

ItemListViewItemView要素を含むアプリケーションを開発中です。私のItemListViewでは、jQuery .each()メソッドを使用してアイテムのコレクションをループし、それらをリスト要素としてレンダリングしています。ループ内のBackbone.jsビュー上のメソッドにアクセスする

実際にli要素が含まれている部分にulが添付されていることを除いて、すべての部分が整っています。固着点は私の.each()ループの内側からItemListView.appendItemメソッドにアクセスしています。 this.appendItemself.appendItemを使用しようとしましたが、ループ内でthisitemであり、selfwindowオブジェクトです。ここで

は、私が今持っているものです。

ItemListView = Backbone.View.extend({ 
    el: '#item-rows', 
    initialize: function() { 
     this.collection = new Items(); 
     this.render(); 
    }, 
    render: function() { 
     $.each(this.collection.models, function (i, item) { 
      var itemview = new ItemView({ model: item }); 
      this.appendItem(itemview); // this refers to the item, so appendItem is undefined 
     }); 
    }, 
    appendItem: function (itemView) { 
     $(this.el).append(itemView.render().el); 
    } 
}); 

var itemlistview = new ItemListView; 

私はコンソールに出力することで、このの他の部分を検討してきたように、私は、コンテキストの問題が唯一の問題であることをかなり確信していると彼らは上品に見える。

私には何が欠けていますか?

答えて

2

ええ、それはかなり単純な修正です。外側の文脈でthisを参照するだけです。

render: function() { 
    var somereftothis = this; 
    $.each(this.collection.models, function (i, item) { 
     var itemview = new ItemView({ model: item }); 
     somereftothis.appendItem(itemview); // this refers to the item, so appendItem is undefined 
    }); 
}, 
+0

ほら、ええ、忘れてしまいましたそのトリックについてありがとう! –

+0

その一時変数 "that"を呼び出すことは実用的です。 – knub

+0

そして、@ rfundukによって投稿された答えのように、文脈を正しく設定する方がよい –

3

コレクションのeach、underscore.jsによって提供を使用することですこれを行うにはより多くのバックボーン-yの道:

render: function() { 
    this.collection.each(function(item, index) { 
    var itemView = new ItemView({ model:item }); 
    this.appendItem(itemView); 
    }, this); 
    return this; 
} 

注:

  • 予告秒のparamへeachは、関数をバインドするための参照を受け取ります。
  • eachは、要素fiこの部分のないRSTとインデックス秒
  • renderは、一般的に(docsで述べたように)、連鎖の目的のためにthisを返す必要があり、あなたが期待するように、私はあなたのappendItem機能が動作するとは思わない
関連する問題