如何在ExtJS中应用过滤器

如何在ExtJS中应用过滤器,extjs,extjs4,Extjs,Extjs4,我正在使用: Ext.ux.grid.FiltersFeature 它工作正常,但每当我加载存储数据时 tablePanel.store.loadData(..) 过滤器不受尊重。列被视为已过滤(即灰显),但显示的是所有行,而不是已过滤的行子集 以下是JSFIDLE中捕获的错误: 要重现我的问题: 选择“名称”上的列筛选器,将其设置为值“foo” 现在应该只显示一行(foo行) 现在点击重置 过滤器设置为仅显示“foo”,但它也显示“bar” 我知道有一种方法可以删除过滤器: grid.

我正在使用:

Ext.ux.grid.FiltersFeature

它工作正常,但每当我加载存储数据时

tablePanel.store.loadData(..)
过滤器不受尊重。列被视为已过滤(即灰显),但显示的是所有行,而不是已过滤的行子集

以下是JSFIDLE中捕获的错误:

要重现我的问题:

  • 选择“名称”上的列筛选器,将其设置为值“foo”
  • 现在应该只显示一行(foo行)
  • 现在点击重置
  • 过滤器设置为仅显示“foo”,但它也显示“bar”
我知道有一种方法可以删除过滤器:

grid.store.clearFilter();
我正在寻找这样一种方法:

grid.store.applyFilters();
因此,我可以在刷新表中的数据后执行它

**更新**

如果我再深入一点,我可以看到在表面板中设置了一个过滤器字符串

表格面板-->过滤器-->过滤器-->项-->[1]-->输入项-->值='mySearchString'

然而,这就是桌面面板上的过滤器。如果改为查看tablePanel-->存储,则会发现未设置任何项的筛选器:

表格面板-->存储-->过滤器-->过滤器-->项目-->[0]

这几乎就好像有两个不同的过滤系统在起作用,它们彼此不通信

更让人恼火的是,store有一个过滤方法,而grid没有过滤方法

grid.store.filter(); //method exists

grid.filter(); //crashes

令人费解。

这里的问题是网格过滤器功能创建了一个到底层存储过滤机制的接口。如果您绕过功能界面,直接进入商店,过滤器就不知道这一点,并且会感到困惑

因此,只使用由定义的API,一切都应按预期工作。例如,要清除过滤器,请使用:

 grid.filters.clearFilters()
我使用并提出了一个解决方案,在存储加载后设置值。在
grid.store.loadData
之后,我添加了这个代码,一个接一个地重新应用过滤器

var filterData = grid.filters.getFilterData();
Ext.Array.each(filterData, function(filter){
    grid.filters.filters.getByKey(filter.field).setValue(filter.data.value)
})

如果列显示它们正在被筛选,但结果没有显示,则可能没有将筛选值正确地传递到服务器(假设您使用的是远程筛选)。不使用远程筛选。即使使用本地筛选,如果筛选器处于活动状态且具有值,则应在刷新存储时应用该筛选器。如果您使用列菜单中的菜单激活一个过滤器,过滤器是否工作?嗯,是的,工作正常。这只是商店的装货。在执行store.loadData()之后是否需要执行类似store.refresh()的操作?查看
loadData
的源代码,它似乎会检查
filterOnLoad
是否设置为true,如果设置为true,则会调用
filter
方法。我知道这是使用默认的存储过滤,但可能
FiltersFeature
也使用了它。因此,您可以尝试将
filternoad:true
和(我假设已经设置了)
remoteFilter:false
添加到存储配置中。是的,但我没有看到任何类似grid.filters.applyFilters()的方法。有和方法。不是吗?是的,他们添加了过滤器。但我已经添加了过滤器,什么都没有发生。(见上文)。这就像商店过滤器和网格过滤器彼此不通信一样。是的,这可能是Ext或应用程序中的错误。你能准备一个工作展示吗?我想看一看。尝试,但我不知道如何导入FiltersFeature。(见我关于StackOverflow的最新问题)1秒钟的延迟有点烦人。。。但我会给你:)