基本上我想要做的是为我的 HTML 表的每一行创建一个 Backbone 视图,当我渲染我的表时我可以轻松地完成这个我为每个 tr 实例化一个主干视图,这将是视图的“el” .
但是,这会导致每个 tr 都有一个事件监听器,效率不高。有没有办法完成同样的事情,即让每个行视图的“el”成为 tr,但所有事件都从表元素委派,因此只有一个事件监听器存在?
也许有一个表的父视图并以某种方式委托所有事件,或者我真的不知道如何以一种好的方式解决这个问题,谢谢。
基本上我想要做的是为我的 HTML 表的每一行创建一个 Backbone 视图,当我渲染我的表时我可以轻松地完成这个我为每个 tr 实例化一个主干视图,这将是视图的“el” .
但是,这会导致每个 tr 都有一个事件监听器,效率不高。有没有办法完成同样的事情,即让每个行视图的“el”成为 tr,但所有事件都从表元素委派,因此只有一个事件监听器存在?
也许有一个表的父视图并以某种方式委托所有事件,或者我真的不知道如何以一种好的方式解决这个问题,谢谢。
正常的方法是使用 aTableView
和多个RowView
s。TableView 将与 a 相关联,Collection
并且它将RowView
根据需要在此 Collection 上迭代实例化尽可能多的 s。
如果 Collection 发生变化,TableView 还将监听 Collection 中的更改并创建和删除 RowView 实例。
RowView 将监听 Collection 中每个Model
s 的变化。并通过与每个模型关联的活动 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" ) );
}
});
只需确保row
TableView 可以通过data-row-id
示例中的任何特殊属性识别每个属性。但是当您直接在 RowView 中直接使用此事件时,您必须转到 Collection,搜索具体的模型并采取行动访问模型,一切工作更自然。
实际上,我认为您不会获得更好的性能,我认为底层 jQuery 将创建相同数量的事件侦听器。