Я думаю, что есть два способа сделать это.
- Используйте представление для каждого элемента и управляйте DOM самостоятельно. Это то, что делает пример Todos. Это хороший способ сделать вещи, потому что обработка событий для одного элемента модели более понятна. Вы также можете сделать один шаблон для каждого элемента. С другой стороны, у вас нет единого шаблона для представления коллекции в целом.
- Используйте представление для всей коллекции. Главное преимущество в том, что вы можете выполнять больше манипуляций в своих шаблонах. Недостатком является то, что у вас нет шаблона для каждого элемента, поэтому, если у вас есть разнородная коллекция, вам нужно включить код шаблона представления коллекции - bletcherous.
Для второй стратегии я создал код, который работает примерно так:
var Goose = Backbone.Model.extend({ });
var Gaggle = Backbone.Collection.extend({
model: Goose;
};
var GaggleView = Backbone.View.extend({
el: $('#gaggle'),
template: _.template($('#gaggle-template').html()),
render: function() {
$(this.el).html(this.template(this.model.toJSON()));
}
};
var g = new Gaggle({id: 69);
g.fetch({success: function(g, response) {
gv = new GaggleView({model: g});
gv.render();
}});
Код шаблона будет выглядеть примерно так:
<script type="text/template" id="gaggle-template">
<ul id="gaggle-list">
<% _.each(gaggle, function(goose) { %>
<li><%- goose.name %></li>
<% }); %>
</ul>
</script>
Обратите внимание, что я использую функции _ (полезно!) В шаблоне. Я также использую элемент "obj", который фиксируется в функции шаблона. Это, вероятно, немного обманывает; передача в {gaggle: [...]} может быть лучше и меньше зависеть от реализации.
Я думаю, что когда дело доходит до этого, ответ звучит так: «Есть два способа сделать это, и ни один из них не настолько велик».