Backbone.js的:过滤收集的正确方法是什么?(Backbone.js: correct wa

2019-06-26 21:52发布

我使用当前的方法是过滤的集合,它返回一个阵列,并使用

collection.reset(array)

重新填充它。 然而,这种修改原始收藏,所以我加了所谓的“originalCollectionArray”一个数组,跟踪收集的初始阵列状态的。 当没有过滤激活我简单地使用

collection.reset(originalCollectionArray)

但后来,我需要不断增加,并从真实采集去除车型赛道,所以我这样做:

// inside collection
initialize: function(params){
    this.originalCollectionArray = params;
    this.on('add', this.addInOriginal, this);
    this.on('remove', this.removeInOriginal, this);
},
addInOriginal: function(model){
    this.originalCollectionArray.push(model.attributes);
},
removeInOriginal: function(model){
    this.originalTasks = _(this.originalTasks).reject(function(val){
        return val.id == model.get('id');
    });
},
filterBy: function(params){
    this.reset(this.originalCollectionArray, {silent: true});
    var filteredColl = this.filter(function(item){
        // filter code...
    });
    this.reset(filteredColl);
}

这是迅速成为累赘,因为我尝试实施有关集合的操纵其他技巧,如排序。 坦率地说,我的代码看起来有点哈克。 是否有这样做的一个优雅的方式?

谢谢

Answer 1:

您可以创建一个集合作为主要收集反映了过滤器的状态特性:

var C = Backbone.Collection.extend({
    initialize: function (models) {
        this.filtered = new Backbone.Collection(models);
        this.on('add', this.refilter);
        this.on('remove', this.refilter);
    },

    filterBy: function (params){
        var filteredColl = this.filter(function(item){
          // ...
        });

        this.filtered.params = params;
        this.filtered.reset(filteredColl);
    },

    refilter: function() {
        this.filterBy(this.filtered.params);
    }
});

父集合保持它的模型,你应用任何过滤器,并绑定到过滤收集知道什么时候已经发生的变化。 在添加内部绑定和删除事件,您可以重新应用过滤器。 见http://jsfiddle.net/dQr7X/了演示。



Answer 2:

在你的代码的主要问题是,你正在使用的,而不是一个集合原始数组作为原。 我的代码是接近你的,但只使用集合,所以方法,如增加,删除和过滤器适用于原来的:

  var OriginalCollection = Backbone.Collection.extend({
  });
  var FilteredCollection = Backbone.Collection.extend({
    initialize: function(originalCol){
        this.originalCol = originalCol;
        this.on('add', this.addInOriginal, this);
        this.on('remove', this.removeInOriginal, this);
    },
    addInOriginal: function(model){
        this.originalCol.add(model);
    },
    removeInOriginal: function(model){
        this.originalCol.remove(model);
    },
    filterBy: function(params){
        var filteredColl = this.originalCol.filter(function(item){
            // filter code...
        });
        this.reset(filteredColl);
    }   
  });


文章来源: Backbone.js: correct way of filtering a collection?