基本上我想要的东西是我的HTML表的每一行都有一个Backbone视图,当我渲染我的表时,我可以很容易地实现这一点,我为每个tr实例化一个backbone.view,那就是“el”观点。
但是,这将导致每个tr都有一个eventlistener,效率不高。有没有办法完成同样的事情,即每个行视图的“el”是tr,但是所有事件都是从table元素委托的,因此只存在一个eventlistener?
也许有桌子的父视图并以某种方式委派所有事件,或者我真的不知道如何以一种好的方式解决这个问题,谢谢。
答案 0 :(得分:3)
正常的做法是拥有TableView
和多个RowView
。 TableView将与Collection
相关联,它将根据需要实例化RowView
个迭代此集合。
如果Collection发生更改,TableView也会监听Collection中的更改以及创建和删除RowView实例。
RowView将收听集合中每个Model
的更改。 通过与每个模型关联的活动DOM元素上的用户交互来监听。
我没有看到任何问题。我认为这是最直观,可维护和优雅的结构。
如果你真的认为让TableView同时监听所有行中的事件会更好,那就试试这个:
var TableView = Backbone.View.extend({
events: {
"click tr a.remove", "remove"
},
remove: function( event ){
console.log( "row-id", $(event.target).attr( "data-row-id" ) );
}
});
请确保TableView中的每个row
都可以通过示例中的任何特殊属性data-row-id
来识别..但是他们必须转到Collection,搜索具体的Model和act,直接在RowView中使用此事件时,您可以直接访问模型,一切都更自然。
实际上我并不认为你会获得更好的表现,我认为发达的jQuery会创造相同数量的事件监听器。