1

我目前正在开发一个存储大量数据的 Sencha Touch 应用程序,并且我只想使用该数据的一个子集。商店已被过滤到子集,然后我可能想要进一步过滤它。

我可以使用filter (col, val)轻松地过滤器添加到商店。但是,如果我想将我的数据集“还原”为“原始”过滤较少但仍过滤的数据,如何仅删除/清除该过滤器?

在API文档中,我只能找到没有用的clearFilter (),因为它删除了所有之前设置的过滤器。

我只能认为这样做的方法是拍摄原始过滤器的快照,清除所有过滤器,然后重新应用原始过滤器......但这听起来会显着影响性能,特别是如果原始数据集很大。

有一个更好的方法吗?

4

1 回答 1

2

这不适用于本地过滤的存储,并且使用一些未记录的功能,因此可能会将您暴露给未来的 API 更改,但您可以访问data您存储的属性,该属性Ext.util.Collection确实公开了一个removeFilters方法。

查看它的实现,您会发现可以通过以下类型的调用删除过滤器:

store.data.removeFilters(col);

// remove all filters at once, because the collection will be updated for each call to removeFilters
store.data.removeFilters([col1, col2]);

之后,您必须手动触发事件以通知绑定到商店的事物:

var data = store.data;
store.fireEvent('filter', store, data, data.getFilters());
store.fireEvent('refresh', store, data);

现在,应用一个新的过滤器集将意味着遍历集合中的所有项目(而不是仅那些已经通过先前过滤器的项目)。因此,除非我遗漏了某些内容,否则移除过滤器而不是例如用全新的设置替换当前设置的过滤器不会给您带来任何性能提升。

您必须注意的是一次应用所需的过滤器更改(无论是通过删除还是添加它们),因为所有过滤器方法都会触发所有项目的传递。

如果我是你,我不会太担心,因为 AFAIK 循环遍历几千个对象应该是一个几乎瞬时的操作,即使在像手机这样的小型处理器上也是如此。

于 2013-06-03T16:03:04.633 回答