我了解如何将一个集合或单个模型组合在一起。而且我通常可以获得模型的数据来显示。但我根本不清楚如何获取一个集合并获取该集合中的模型列表以显示。
我应该迭代集合并单独渲染每个模型吗?这应该是集合的渲染功能的一部分吗?
还是集合只是有它自己的视图,并且我以某种方式将整个集合数据填充到视图中?
笼统地说,显示模型列表的正常方法是什么?
我了解如何将一个集合或单个模型组合在一起。而且我通常可以获得模型的数据来显示。但我根本不清楚如何获取一个集合并获取该集合中的模型列表以显示。
我应该迭代集合并单独渲染每个模型吗?这应该是集合的渲染功能的一部分吗?
还是集合只是有它自己的视图,并且我以某种方式将整个集合数据填充到视图中?
笼统地说,显示模型列表的正常方法是什么?
根据我的经验,最好在集合视图中保留对每个模型视图的引用。
我目前正在处理的项目中的这个片段应该可以帮助你更好地理解这个想法:
var MyElementsViewClass = Backbone.View.extend({
tagName: 'table',
events: {
// only whole collection events (like table sorting)
// each child view has it's own events
},
initialize: function() {
this._MyElementViews = {}; // view chache for further reuse
_(this).bindAll('add');
this.collection.bind('add', this.add);
},
render: function() {
// some collection rendering related stuff
// like appending <table> or <ul> elements
return this;
},
add: function(m) {
var MyElementView = new MyElementViewClass({
model: m
});
// cache the view
this._MyElementViews[m.get('id')] = MyElementView;
// single model rendering
// like appending <tr> or <li> elements
MyElementView.render();
}
});
采用这种方法可以更有效地更新视图(重新渲染表中的一行而不是整个表)。
我认为有两种方法可以做到这一点。
对于第二种策略,我完成了如下代码:
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: [...]} 可能会更好,并且更少依赖于实现。
我认为归根结底,答案是“有两种方法可以做到,但都不是那么好。”
我还发现这是 Backbone 框架中令人困惑的部分。
示例 Todos 代码是此处的示例。它使用 4 个类:
这并不是世界上第一次审查的最佳例子。特别是,它不使用 Router 类来路由 URL,也不将模型类映射到 REST 资源。
但似乎“最佳实践”可能是为集合的每个成员保留一个视图,并直接操作由这些视图创建的 DOM 元素。