0

タイルのコレクションがあります。アプリが起動すると、サーバーからコレクションがフェッチされ、そのクローンがオブジェクトのcollectionプロパティに割り当てられます。MdApp.TilesCollection

MdApp.TilesCollection.fetch({
        success: function(){
            console.log('Tiles collection fetched from server');
            console.log(MdApp.TilesCollection);
            if(!MdApp.TilesCollection.collection){
                MdApp.TilesCollection.collection = new Backbone.Collection(MdApp.TilesCollection.models);
                console.log('Made copy of collection in fetched collection instance');
            }
        },
        error: function(){
            console.log('Error!Unable to fetch tiles collection from server');
        }
    });

これは、フィルタリングの目的で行われます。

    TilesCollection = Backbone.Collection.extend({

    model: MdApp.TileModel,

    url : 'api/',

    rewriteModel: function(model){
        this.set(model);
    },

    byPrivate : function(){
        var filtered = this.collection.filter(function(tile){
            return tile.get('private') == '1';
        });
        console.log('filtered private: ' + filtered);
        return filtered;
    },

    byPublic : function(){
        var filtered = this.collection.filter(function(tile){
            return tile.get('private') == '0';
        });
        console.log('filtered public: ' + filtered);
        return filtered;
    },

    byFavourite: function(){
        var filtered = this.collection.filter(function(tile){
            return tile.get('favourite') == '1';
        });
        console.log('filtered favourite: ' + filtered);
        return filtered;
    },

    byAsc : function(){
        var filtered = this.collection.sortBy(function(tile){
            return tile.get('id');
        });
        console.log('filtered ascending: ' + filtered);
        return filtered;
    },

    byDesc : function(){
        var filtered = this.collection.sortBy(function(tile){
            return -tile.get('id');
        });
        console.log('filtered descending: ' + filtered);
        return filtered;
    },

    refilter: function(){
        console.log(this.collection);
        return this.collection.models;
    }
});

私がやりたいことは、同期を維持することMdApp.TilesCollectionですMdApp.TilesCollection.collection。のモデルが追加または変更された場合MdApp.TilesCollection、そのクローンに特定の変更を加えたいと思います。もちろん、何かが変更されるたびに新しいコレクションを作成してそのプロパティに割り当てることもできますが、コレクションが非常に大きい場合は非常に非効率になる可能性があります。誰でもヒントや解決策をドロップできますか?

4

1 に答える 1

1

フィルタリングを行うためにコレクションのクローンを保持する必要はありません。元のコレクションに対してこれらのフィルタ操作を行うことができます。

byPrivate : function(){
    var filtered = this.where({ private: 1 });
    console.log('filtered private: ' + filtered);
    return filtered;
}

何らかの理由でクローンを保持して同期したい場合は、フェッチ成功のコールバックで新しいコレクションを作成する代わりに、次のように単純にリセットできます。

MdApp.TilesCollection.collection.reset(MdApp.TilesCollection.models);
于 2013-05-11T16:54:46.417 に答える