多个集合绑定到一个基本集合,包含过滤器和事件

时间:2013-06-25 06:55:17

标签: backbone.js backbone-collections

我有一个从后端提供的复杂模型,它有一堆常规属性,一些嵌套模型和几个集合。

我的页面有两个表,一个表用于无效项,另一个表用于有效项。有问题的项目来自其中一个嵌套集合。我们称之为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);

这对于从一个基本集合中实际独立填充两个表是很好的。但显然,我并没有把整个事件管道放到基本集合中。这意味着当文档的有效性发生变化时,它没有简洁的方式转移到其他集合,因此另一个视图。

我所追求的是拥有基本集合的一种很好的方式,我可以将过滤器集合置于其上。有什么建议吗?

1 个答案:

答案 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
);