我有一个CollectionView,可以生成这种列表
<ul>
<li> All </li>
<li> Option 2</li>
<li> Option 2<li>
<ul>
有关此列表的第二个和第三个条目的所有信息都是从DB中获取的。 但是我想拥有&#34; All&#34;也有选择。我希望这个选项能够成为我收藏中的第一个位置。
我想到的只是覆盖MyCollection的add()
方法。它工作得很好,但我只是检查是否有更好/更简单的方法。
MyCollection的:
define([ 'underscore', 'backbone', 'models/MyModel'], function(_, Backbone, MyModel){
var MyCollection = Backbone.Collection.extend({
model: MyModel,
initialize: function(opts) {
this.options = opts;
this.add({name: "All", icon_class="all"}) /// this doesn't work
},
add: function(models, options) {
models.unshift({name:"All", icon_class:"all"})
return this.set(models, _.extend({merge: false}, this.options));
},
});
return MyCollection;
});
(另一方面,集合本身不是从DB中获取数据。实际上,fetch被称为a(让我们称之为)ModelX
,它分配数据到也使用相同数据的其他集合。
因此,一旦ModelX
完成获取所有数据,它就会将数据传递给所有必需的视图。)
答案 0 :(得分:2)
我在模板级别上解决了这些问题。因为这个元素并非真正存在于你的收藏中,所以我不会伪造它:
<ul>
<li>All</li>
<% _.each(item, function (i) { %>
<li><%- i.name%></li>
<% }); %>
</ul>
答案 1 :(得分:0)
我认为你有正确的想法。由于您有单独的模型来表示服务器上的持久数据,因此数据显示此集合显然是为了表示视图数据,因此将 All 放入集合中是可以的。
您可以从集合内部或外部&#34;控制器&#34;中执行此操作,具体取决于您的体系结构。你似乎想做前者。
但是你的add
hack非常难看。覆盖构造函数会更清晰。 (请参阅here了解为何initialize
无法正常工作。)
var MyCollection = Backbone.Collection.extend({
model: MyModel,
constructor: function(models, options) {
if (!models) models = [];
models.unshift({name:"All", icon_class:"all"});
Backbone.Collection.prototype.constructor.call(this, models, options);
},
}