Мы все знаем, что делать что-то подобное плохо:
<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;
}
});
Если я не ошибаюсь, создание экземпляра listView с коллекцией из 500 моделей дает мне 500 событий нажатия, по одному для каждой строки. Это плохо, верно?
Я знаю, что Backbone встроил делегирование событий для событий в пространстве имен:
events : {
'click li' : 'log'
}
Полагаю, я мог бы поместить это в свой ListView, и это создало бы только одно событие щелчка для всего списка, но тогда я не смог бы получить доступ к данным модели, соответствующим элементу списка, по которому щелкнули.
Какие шаблоны используют разработчики магистральных сетей для решения этой типичной проблемы?