2

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

我的页面有两个表格,一个用于无效项目,一个用于有效项目。有问题的项目来自嵌套集合之一。让我们称之为baseModel.documentCollection,实施DocumentsCollection

我不希望在我Marionette.CompositeView的 s 中有任何过滤代码,所以我所做的如下(注意,为“有效”案例重复):

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

这对于实际从一个基本集合独立填充两个表来说很好。但显然,我并没有将整个事件管道归结为基本集合。这意味着当一个文档的有效性发生变化时,没有巧妙的方法将它转移到另一个集合,因此转移到另一个视图。

我所追求的是一种很好的方式来拥有一个基础集合,我可以在上面放置过滤器集合。有什么建议么?

4

1 回答 1

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);
   }
});

我遇到的一个小问题是我必须手动应用filterFuncbaseCollection,然后items在实例化 a 时将其作为参数传递FilteredCollection,但这是我可以忍受的。

下面的代码是我用来实例化的。请注意,还有另一个几乎完全相同的副本,用于仅收集有效项目,但可以应用任何过滤器。

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
);
于 2013-06-26T04:27:32.253 回答