2

バックエンドから提供される複雑なモデルがあります。これには、多数の通常の属性、いくつかのネストされたモデル、およびいくつかのコレクションがあります。

マイページには、無効なアイテム用と有効なアイテム用の 2 つのテーブルがあります。問題のアイテムは、ネストされたコレクションの 1 つからのものです。baseModel.documentCollectionを実装して と呼びましょうDocumentsCollection

私は私のsにフィルタリングコードを入れたくない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 つのベース コレクションから 2 つのテーブルを個別に作成する場合に適しています。しかし、明らかに、イベント パイプライン全体をベース コレクションに落とし込んでいるわけではありません。これは、ドキュメントの有効性が変更されたときに、他のコレクション、つまり他のビューに移行する適切な方法がないことを意味します。

私が求めているのは、フィルター コレクションを上に置くことができる基本コレクションを持つ良い方法です。助言がありますか?

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

これに関する小さな問題の 1 つは、 に手動で適用filterFuncし、をインスタンス化するときにそれをパラメーターbaseCollectionとして渡す必要があることですが、それは私が受け入れることができるものです。itemsFilteredCollection

以下のコードは、インスタンス化に使用しているものです。ONLY VALID アイテムのコレクション用のほぼ正確なコピーがもう 1 つありますが、任意のフィルターを適用できることに注意してください。

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 に答える