我也必须这样做。它是一个更大的函数的一部分,该函数将 JSON“网格格式对象”(包含任意数量的网格过滤器、可见列以及排序列和方向)应用于渲染的网格面板。
要求是用户需要能够将现有网格面板的可见列、应用过滤器和应用排序保存到具有名称的数据库中,然后能够在以后将这三件事重新应用到网格面板以获得相同的结果过滤器、可见列和排序状态,方法是选择它们保存的格式。
我也不想使用商店过滤器,因为如果用户想要调整它们,则需要在网格面板过滤器功能 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 完成的
编辑:
我意识到实现的一个重要部分是从该函数中看不到的。
通常,filter feature
只有在用户实际单击其中一个时,才会创建网格面板菜单。然后它们都被创建了。我想这是为了节省内存?
显然,在创建过滤器菜单之前,此功能将不起作用。
为了处理这个问题,我在网格面板的事件中明确地创建了它们,afterrender
以便它们立即可用。即使用户没有单击过滤器菜单之一,此功能也将起作用。
我正在使用 MVC 模式,所以我从网格面板的控制器中进行了操作,如下所示:
// code from gridpanel's controller
var me = this;
me.control({
'log': {
afterrender: function() {
me.getLog().filters.createFilters();
},
},
// ... other event handlers
});