gpt4 book ai didi

collections - Backbone.js:过滤集合的正确方法?

转载 作者:行者123 更新时间:2023-12-04 05:55:04 26 4
gpt4 key购买 nike

我正在使用的当前方法是过滤一个集合,该集合返回一个数组,并使用

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

当我尝试实现与集合操作相关的其他技巧(例如排序)时,这很快变得很麻烦。坦率地说,我的代码看起来有点老套。有没有一种优雅的方式来做到这一点?

谢谢

最佳答案

您可以创建一个集合作为反射(reflect)过滤器状态的主集合的属性:

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

无论您应用什么过滤器,父集合都会保留其模型,并且您绑定(bind)到过滤后的集合以了解何时发生更改。在 add 和 remove 事件上进行内部绑定(bind)可让您重新应用过滤器。看
http://jsfiddle.net/dQr7X/演示。

关于collections - Backbone.js:过滤集合的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11886628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com