我有一个从后端提供的复杂模型,它有一堆常规属性,一些嵌套模型和几个集合。
我的页面有两个表,一个表用于无效项,另一个表用于有效项。有问题的项目来自其中一个嵌套集合。我们称之为baseModel.documentCollection
,实施DocumentsCollection
。
我不希望在我的Marionette.CompositeView
中有任何过滤代码,所以我所做的就是以下内容(注意,对于'有效'案例重复):
var invalidDocsCollection = new DocumentsCollection(
baseModel.documentCollection.filter(function(item) {
return !item.isValidItem();
})
);
var invalidTableView = new BookIn.PendingBookInRequestItemsCollectionView({
collection: app.collections.invalidDocsCollection
});
layout.invalidDocsRegion.show(invalidTableView);
这对于从一个基本集合中实际独立填充两个表是很好的。但显然,我并没有把整个事件管道放到基本集合中。这意味着当文档的有效性发生变化时,它没有简洁的方式转移到其他集合,因此另一个视图。
我所追求的是拥有基本集合的一种很好的方式,我可以将过滤器集合置于其上。有什么建议吗?
答案 0 :(得分:1)
我充实了我之前的尝试,并提出了Backbone.Collection的扩展,它可以满足我的需求。
collections.FilteredCollection = Backbone.Collection.extend({
initialize: function(items, options) {
if (_.isUndefined(options.baseCollection))
throw "No base collection to watch";
if (!_.isFunction(options.filterFunc)) {
throw "No filter to apply";
}
_.extend(this, options);
this.listenTo(this.baseCollection, 'all', this.reraise);
},
reraise: function (event) {
this.reset(this.baseCollection.filter(this.filterFunc), { silent: true });
var args = [].slice.call(arguments, 1);
this.trigger(event, args);
}
});
我遇到的一个小问题是,我必须手动将filterFunc
应用于baseCollection
,然后在实例化items
时将其作为FilteredCollection
参数传递但是,这是我可以忍受的东西。
以下代码是我用来实例化的。请注意,还有另一个几乎完全相同的副本,用于收集ONLY VALID项目,但可以应用任何过滤器。
var allDocs = theModel.get('Documents');
var invalidOptions = {
baseCollection: allDocs,
filterFunc: function(item) {
return !item.isValidItem();
}
};
var invalidDocs = allDocs.filter(invalidOptions.filterFunc);
var invalidDocsCollection = new collections.FilteredCollection(
invalidDocs, invalidOptions
);