【发布时间】:2011-12-22 12:11:47
【问题描述】:
我们都知道这样做是不好的:
<ul>
<li>Item</li>
<li>Item</li>
... 500 more list items
</ul>
然后……
$("ul li").bind("click", function() { ... });
我一直在查看大量 Backbone 示例/指南,以下似乎是根据模型集合呈现包含项目的列表的标准方法。
var ListView = Backbone.View.extend() {
tagName: 'ul',
render: function() {
this.collection.each(function(item) {
var view = new ListItemView({model: item});
$(this.el).append(view.render().el);
});
return this;
}
});
列表项视图:
var ListItemView = Backbone.View.extend() {
tagName: 'li',
events: {
'click' : 'log'
}
log : function() {
console.log(this.model.get("title"));
}
render: function() {
$(this.el).html(this.template(this.model.toJSON()));
return this;
}
});
如果我没记错的话,用一个包含 500 个模型的集合实例化 listView,会给我 500 个点击事件,每行一个。这很糟糕吧?
我知道 Backbone 已经为命名空间事件内置了事件委托:
events : {
'click li' : 'log'
}
我想我可以把它放在我的 ListView 中,它只会为整个列表创建一个单击事件,但是我将无法访问与单击的列表项对应的模型数据。
主干开发人员使用什么模式来解决这个典型问题?
【问题讨论】:
标签: javascript performance backbone.js