Extjs 无法将筛选器重新应用于网格
我有一个网格(Extjs 无法将筛选器重新应用于网格,extjs,extjs4,Extjs,Extjs4,我有一个网格(Ext.grid.Panel),需要对其应用过滤器。这些过滤器将是预定义的(与通过从网格列下拉列表中手动选择过滤器来设置的过滤器相反) 我有两个职能: // Clear filter function() { grid.filters.clearFilters(); } // Apply filter function() { grid.filters.clearFilters(); grid.filters.addFilter({ da
Ext.grid.Panel
),需要对其应用过滤器。这些过滤器将是预定义的(与通过从网格列下拉列表中手动选择过滤器来设置的过滤器相反)
我有两个职能:
// Clear filter
function() {
grid.filters.clearFilters();
}
// Apply filter
function() {
grid.filters.clearFilters();
grid.filters.addFilter({
dataIndex: 'size',
type: 'list',
options: ['small', 'medium', 'large', 'extra large'],
value: ['small', 'medium']
});
store.load();
}
第一次应用过滤器效果很好。但是,如果调用函数清除过滤器,然后再次尝试应用过滤器,则不会过滤数据。我没有收到任何错误或反馈
我也不确定这是否是添加过滤器的推荐方法。我在网上看到过一些例子,其中过滤器直接应用于商店,但从我所看到的情况来看,网格无法识别这些过滤器是否到位
如果有任何帮助,我们将不胜感激。您为什么要将筛选器应用于
网格。筛选器
而不是网格。存储
?Ext.data.Store有以下方法filter()
和clearFilter()
我也必须这样做。它是将JSON“网格格式对象”(包含任意数量的网格过滤器、可见列以及排序列和方向)应用于渲染网格面板的更大函数的一部分
要求是,用户需要能够将现有gridpanel的可见列、应用的过滤器和应用的排序保存到具有名称的数据库中,然后在以后能够将这三项内容重新应用到网格面板,通过选择其保存的格式来获得相同的过滤器、可见列和排序状态
我也不想使用商店过滤器,因为所选过滤器选项需要在gridpanel过滤器功能UI(网格过滤器下拉菜单)上可见,以防用户需要调整它们
下面是一个由用户保存的网格格式JSON示例:
{
"columns":[
"first_name",
"last_name",
"course",
"course_room",
"student_status",
"start_date",
"schedule",
"time_on_course",
"attendance",
"this_period",
"acct_bal"
],
"filters":[{
"field":"student_status",
"data":{
"type":"list",
"value":"Attending"
}
}],
"sort":{
"property":"start_date",
"direction":"ASC"
}
}
以下是函数,JSON用作参数:
applyLogFormat: function(format) {
var log = this.getLog(),
format = Ext.JSON.decode(format);
log.filters.autoReload = false;
// apply the grid filters correctly
log.filters.clearFilters();
Ext.each(format.filters, function(filter) {
var gridFilter = log.filters.getFilter(filter.field);
gridFilter.setActive(true);
switch(gridFilter.type) {
case 'date':
var dateValue = Ext.Date.parse(filter.data.value, 'm/d/Y'),
value = filter.data.comparison == 'gt' ? {after: dateValue} : {before: dateValue};
gridFilter = log.filters.getFilter(filter.field);
gridFilter.setValue(value);
break;
case 'list':
gridFilter = log.filters.getFilter(filter.field);
gridFilter.menu.setSelected(gridFilter.menu.selected, false);
gridFilter.menu.setSelected(filter.data.value.split(','), true);
break;
default :
gridFilter = log.filters.getFilter(filter.field);
gridFilter.setValue(filter.data.value);
break;
}
});
// remove any pre-existing sorting from the grid
Ext.each(log.columns, function(column, index) {
if (column.hasCls('x-column-header-sort-ASC') ||
column.hasCls('x-column-header-sort-DESC')) {
log.columns[index].setSortState(null);
return false;
}
});
// show only the specified columns
log.suspendLayout = true;
Ext.each(log.columns, function(column) {
if (column.dataIndex) {
column.setVisible(Ext.Array.contains(format.columns, column.dataIndex));
}
});
log.suspendLayout = false;
log.doComponentLayout();
// set the sorter
if (format.sort) {
var column = log.down('gridcolumn[dataIndex=' +
format.sort.property + ']');
column.setSortState(format.sort.direction);
log.filters.autoReload = true;
} else {
log.store.sorters.clear();
log.store.loadPage(1);
log.filters.autoReload = true;
}
}
这些都是为4.1.0完成的
编辑:
我意识到实现中有一个重要的部分是无法从该函数中看到的
通常,gridpanel过滤器功能
菜单只有在用户实际单击其中一个菜单后才能创建。然后它们都被创造出来了。我想这是为了节省内存
显然,在创建过滤器菜单之前,此功能将不起作用
为了处理这个问题,我在gridpanel的afterrender
事件中显式地创建它们,以便它们立即可用。即使用户没有单击其中一个过滤器菜单,此功能也将工作
我使用的是MVC模式,所以我使用了gridpanel的控制器,如下所示:
// code from gridpanel's controller
var me = this;
me.control({
'log': {
afterrender: function() {
me.getLog().filters.createFilters();
},
},
// ... other event handlers
});
在网格初始化代码中尝试此操作
filtersCfg.createFilters();
filtersCfg.filters.each(function (filter) {
filter.setActive(true);
filter.setActive(false);
});
关于我申请
grid的原因,请参阅我的原始问题。过滤器grid会识别它。别担心。我们在所有的应用程序中都使用这种方法。使用store.filter
为我过滤数据,但是网格列的过滤器菜单不知道过滤器,调用grid.filters.clearFilters()
没有效果。FWIW,我跟着。当我将过滤器直接应用到商店时,我是否需要在商店和电网之间进行任何额外的布线?您可以使用该方法重新应用过滤器吗?调用grid.filters.clearFilters()
后,我尝试的一切都无法应用新的过滤器。没有错误或任何东西,并且日志记录grid.filters.getFilterData()
显示一个空数组。@我现在正在使用的应用程序上运行它。我仔细检查以确保没有任何其他UX应用于此网格。这是一个正常的网格,除了过滤器功能
,但我很确定您已经有了它。你在争论中传递了什么?另外,如果您使用的是4.1.0或4.1.1,我不知道网格上的某些功能是否已更改,这可能会破坏此功能。@我意识到您可能遇到问题的原因,请参阅上面的编辑。@Geronimo我在网格默认筛选方面遇到问题。我将默认过滤器定义为grid.filters,正如您上面所说,除非用户单击标题菜单,否则我无法确定过滤器将如何激活。我找了好几天了。我在这里也提出了一个问题,也许你知道我的解决方案。我的问题: