バックボーンを使用してカテゴリのテーブルを表示しています。2つのビューを作成しました。
- RowView(単一のtrを含む)
- TableView(テーブル構造を含む)
定義:
RowView = Backbone.View.extend({
el: "#content table tbody",
initialize: function() {
this.render();
},
render: function(){
var params = { name: this.model.get('name'), route: this.options.route };
var template = _.template( $("#rowTemplate").html(), params);
this.$el.append(template);
},
events: {
"click #name": "clickHandler"
},
clickHandler: function( event ) {
console.log('Browse subcategories of ' + this.model.get('name'));
}
});
TableView = Backbone.View.extend({
el: "#content",
initialize: function(){
this.render();
},
render: function(){
var row = new this.collection();
var that = this;
row.fetch({
success: function() {
console.log('Collection fetch succeeded');
var params = { title: that.options.title,
counter: row.at(0).get('counter'),
route: that.options.route
};
var template = _.template( $("#tableTemplate").html(), params);
that.$el.html( template );
// RowView's are created by iteration here
for(var x = 1; x < row.length; x++) {
var params = { model: row.at(x), route: that.options.route };
var view = new RowView(params);
}
}
});
}
});
ご覧のとおり、RowViewにクリックイベントを添付しました。
RowViewテンプレート:
<script type="text/template" id="rowTemplate">
<tr>
<td id="name" class="fill"><%= name %></td>
<td><a href="#<%= route %>/<%= name %>/edit" class="btn">Editar</a></td>
</tr>
</script>
いずれかをクリックする#name
と、ビューのすべてのインスタンスでハンドラーがトリガーされます。したがって、1つのカテゴリをクリックすると、次のようになります。
Browse subcategories of category1 127.0.0.1:68
Browse subcategories of category2 127.0.0.1:68
etc...
私の知る限り、それはすべてRowView's
が同じに委任されているためel
です。
私が最初に考えたのは、にを追加category name
しrowTemplate
、DOMの値をビューの値と比較して、実際にイベントをトリガーする値を確認することでした。
しかし、その解決策は本当に醜いように見えます。これを達成する正しい方法は何Backbone
ですか?
追加:ビューを1つだけ作成し、テンプレートを反復処理して行を生成する方がよいと考えられますか?
編集:提供されたコードで十分だと思います。それ以外の場合は追加できます。