ソート セットの一部である列/データストア フィールドにアクセスするにはどうすればよいですか。
リモートソート用にグリッドのソートパラメータを変更しようとしています。列のフィールドのマッピング プロパティと一致するリモート ソート パラメータのソート キーが必要です。通常の「列ヘッダーのクリックでデータを並べ替える」機能を使用しても、これらのことが発生する必要があります。
ソート セットの一部である列/データストア フィールドにアクセスするにはどうすればよいですか。
リモートソート用にグリッドのソートパラメータを変更しようとしています。列のフィールドのマッピング プロパティと一致するリモート ソート パラメータのソート キーが必要です。通常の「列ヘッダーのクリックでデータを並べ替える」機能を使用しても、これらのことが発生する必要があります。
リモートソートとフィールドマッピング (ExtJS 4.1)
この機能は ExtJS には実装されていないようです。ExtJS 4以降に提供されたencodeSorters関数を使用したソリューションを次に示します。モデルのプロトタイプを介してフィールドマップにアクセスするのは少し汚いですが、それは仕事をします:
var store = Ext.create('Ext.data.Store', {
...,
proxy: {
...,
encodeSorters: function (sorters) {
var model = store.proxy.model,
map = model.prototype.fields.map;
return Ext.encode(Ext.Array.map(sorters, function (sorter) {
return {
property : map[sorter.property].mapping || sorter.property,
direction: sorter.direction
};
}));
}
}
});
ただし、元のメソッドをオーバーライドする方が適切です。
Ext.data.proxy.Server.override({
encodeSorters: function(sorters) {
var min, map = this.model.prototype.fields.map;
min = Ext.Array.map(sorters, function (sorter) {
return {
property : map[sorter.property].mapping || sorter.property,
direction: sorter.direction
};
});
return this.applyEncoding(min);
}
});
simpleSortMode を使用していると仮定すると、ストアで次のようなことができます。
listeners: {
beforeload: function( store, operation, eOpts ) {
if (store.sorters.length > 0) {
var sorter = store.sorters.getAt(0),
dir = sorter.direction,
prop = sorter.property,
fields = store.model.getFields(),
i,
applyProp = prop;
for (i = 0; i < fields.length; i++) {
if (fields[i].name == prop) {
applyProp = fields[i].mapping || prop;
break;
}
}
//clearing the sorters since the simpleSortMode is true so there will be only one sorter
store.sorters.clear();
store.sorters.insert(0, applyProp, new Ext.util.Sorter({
property : applyProp,
direction: dir
}));
}
}
},