リストに表示する項目がいくつかあるとします。リストには、すべてのアイテムをアイテム ビューとして集約するビューがあります。ここで、アイテム ビューでクリック イベントを処理する必要があり、その処理をリスト ビューに委任します。
コード例を見てみましょう。
ItemView = Backbone.View.extend({
className: 'item',
initialize: function() {
this.$el.data('backbone-view', this);
}
});
ビューオブジェクト自体をルート要素のプロパティとしてアタッチしていることに注意してください。これにより、ビューと要素の循環参照状況が本質的に作成されます。
ListView = Backbone.View.extend({
initialize: function() {
// contains the item views
this.items = [];
// click event delegation
this.$el.click(_.bind(this._onClick, this));
},
addItem: function(v) {
if ( !(v instanceof ItemView) ) return;
this.items.push(v);
this.$el.append(v.el);
},
_onClick: function(e) {
var el = $(e.target).closest('.item'),
view = el.data('backbone-view');
// do something with the view
}
});
これは、あらゆる種類のリスト ビューを処理する必要があるときはいつでも、非常に一般的なパターンです。
初期化時に項目に設定した data プロパティを介して、ハンドラーに項目ビューを戻しています。クリック イベントの処理の一部としてアイテムに対して実行したいことはビューに基づいているため、アイテム ビューを取得する必要があります。
またclosest
、アイテム ビューが複雑で、クリック イベントの実際のターゲットがルート要素の子孫である可能性があるため、使用していることにも注意してください。
質問:data
プロパティを介してルート要素にビューをバインドするこの方法は正しいアプローチですか? 特にガベージ コレクションとメモリ リークを考慮する場合は? これより良いものはありますか?