【发布时间】:2012-08-06 20:50:11
【问题描述】:
我目前使用的方法是过滤一个集合,返回一个数组,然后使用
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);
}
当我尝试实现与集合操作相关的其他技巧(例如排序)时,这很快变得很麻烦。坦率地说,我的代码看起来有点老套。有没有一种优雅的方式来做到这一点?
谢谢
【问题讨论】:
-
你有什么理由不只使用
fetch({add: true})而不是重置?听起来这就是您想要实现的目标。我不确定你的filter函数在做什么,但你也可以随时传递{data : {...}}来获取。 -
如果我理解正确,您希望我完全删除 originalCollectionArray 及其事件,并在每次进行过滤/排序时获取原始数据(排序对过滤后的数据执行,因此每次排序也需要获取和过滤)?问题是,过滤器是在用户输入时触发的。我认为这会浪费太多资源。不过,我只是假设性地谈论。