私もこれをしなければなりませんでした。これは、JSON「グリッド形式オブジェクト」(任意の数のグリッドフィルター、表示列、並べ替え列と方向を含む)をレンダリングされたグリッドパネルに適用する、より大きな関数の一部でした。
要件は、ユーザーが既存のグリッドパネルの表示列を保存し、フィルターを適用し、名前を付けてデータベースに並べ替えを適用し、後日、これら3つをグリッドパネルに再適用して同じものを取得できるようにする必要があることでした。保存された形式を選択することにより、フィルター、表示列、およびソート状態。
また、ユーザーが調整したい場合に備えて、選択したフィルターオプションをグリッドパネルフィルター機能の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
メニューは、ユーザーがそれらの1つを物理的にクリックするまで作成されません。次に、それらはすべて作成されます。これはメモリ節約の目的だと思いますか?
明らかに、この機能はフィルターメニューが作成されるまで機能しません。
afterrender
これを処理するために、グリッドパネルのイベントで明示的に作成して、すぐに使用できるようにします。この機能は、ユーザーがフィルターメニューの1つをクリックしていなくても機能します。
私はMVCパターンを使用しているので、次のようにグリッドパネルのコントローラーから使用しました。
// code from gridpanel's controller
var me = this;
me.control({
'log': {
afterrender: function() {
me.getLog().filters.createFilters();
},
},
// ... other event handlers
});