私は次の論理的結論に対する受け入れられた答えを取りました:
そして、これを完全に構成可能なplugin
ベースのソリューションにしました。使用する構成はほとんど必要ありません。そして、Sencha Architect とうまく連携します。
動機
これを調査して動作させる主な動機DateColumn
は、renderer
設定パラメータが としてマークされているため、Sencha Architect がパネルhidden
で変更できないようにするためです。Config
私はその理由を理解しており、それが私をこの解決策に駆り立てました。これは正しい解決策であり、長期的には最も保守性と再利用性が高いと思います。
この記事の執筆時点で:
私は Sencha Architect 3.x と ExtJS 4.2.2 を使用しています。これらの機能をその環境に適用する方法が説明されています。Sencha Architect を使用しない場合は、自分でファイルを作成して管理する必要があります。あらゆるサイズの ExtJS プロジェクトで作業する場合、非常に生産的であることがわかります。
最初は実際GridPlugin
です:
JSResource
プロジェクトに を追加し、を に設定してurl
からjs/CellToolTip.js
、次のコードをその内容としてコピーします。
js/CellToolTip.js
Ext.define('Ext.grid.plugin.CellToolTip', {
extend: 'Ext.AbstractPlugin',
alias: 'plugin.CellQTip',
config: {
debug: false
},
init: function(grid) {
// You may not need the scope, but if you do, this binding will
// allow to preserve the scope configured in the column...
var pluginRenderer = Ext.Function.bind(this.renderer, this);
Ext.each(grid.query('gridcolumn'), function(col) {
var renderer = col.renderer;
col.renderer = renderer ? Ext.Function.createSequence(renderer, pluginRenderer) : pluginRenderer;
});
},
renderer: function(value, metaData, record, rowIndex, colIndex, store, view) {
var col = view.getGridColumns()[colIndex];
var fn = this[col.itemId];
if (fn) {
metaData.tdAttr = fn(value, metaData, record, rowIndex, colIndex, store, view);
}
return value;
}
});
に適用する方法は次のGridPanel
とおりです。
Process Config
プラグインを適用するそれぞれに関数と呼ばれるものを追加GridPanel
します。
これが行うことは、インターセプター関数として機能し、実際に適用される前にconfig
を変更できるようにすることです。Component
processBlobInfoGridPanel: function(config) {
var ttp = Ext.create('Ext.grid.plugin.CellToolTip', {
createdOn: function(value, metaData, record, rowIndex, colIndex, store, view) { return 'data-qtip="' + value.toUTCString() + '"'; },
byteSize: function(value, metaData, record, rowIndex, colIndex, store, view) { return 'data-qtip="' + value + ' bytes"'; }
});
config.plugins = [ttp];
return config;
},
これらを Sencha Architect プロジェクトに追加する方法:
最初にこれが行うことは、各属性がプラグインを適用するそれぞれの属性である独自の構成で を作成することですplugin
。itemId
Column
それぞれに関連付けられている関数にはColumn
、構成とまったく同じ署名がありrenderer
ます。
ここでは、関数の実装は短く、1 行で記述されています。これは単なる一例であり、簡潔にするための例です。
ツールチップ機能の説明:
createdOn
の時間としてToolTip
for eachCell
を追加します。Column
UTC
byteSize
生のバイト数を詳細として表示するToolTip
for eachCell
を追加します。Column
次に、構成されたプラグインのインスタンスを の に追加し、 のインスタンスをconfig
返しGridPanel
ますconfig
。
ボーナスクラス
Sencha Architect でColumn
を表すSize
を作成Resources
し、最大の適切な間隔で人間が読める形式としてバイト サイズを表示したいと考えました。そこで、これrenderer
を行う関数を追加しました。
Column
複数のGridPanel
インスタンスでこれが必要になることに気付いたので、 Class に昇格させました。
これを行う方法は、 を右クリックしてColumn
を選択することPromote to Class
です。次に、Sencha Architect は次のコードを作成し、パネルで指定しapp/view
たファイル名と同じ名前で、ディレクトリ内のファイルに配置します。userClassName
Config
Ext.define('AdminApp.view.ByteSize', {
extend: 'Ext.grid.column.Column',
alias: 'widget.byteSize',
itemId: 'byteSize',
dataIndex: 'size',
text: 'Size',
tooltip: 'Byte size in human readable format',
initComponent: function() {
var me = this;
me.callParent(arguments);
},
renderer: function(value, metaData, record, rowIndex, colIndex, store, view) {
// convert bytes into a human readable format"
var bytes = value;
if (bytes>=1073741824) {bytes=(bytes/1073741824).toFixed(2)+' GB';}
else if (bytes>=1048576) {bytes=(bytes/1048576).toFixed(2)+' MB';}
else if (bytes>=1024) {bytes=(bytes/1024).toFixed(2)+' KB';}
else if (bytes>1) {bytes=bytes+' bytes';}
else if (bytes==1) {bytes=bytes+' byte';}
else {bytes='0 byte';}
return bytes;
}
});
これの元のインスタンスは、Column
この新しいを指していますClass
:
columns: [
{
xtype: 'byteSize',
itemId: 'byteSize'
}
]
GridPanel
Sencha Architectの他のインスタンスでこれを使用するにColumn
は、この新しいクラスにリンクされているインスタンスを右クリックして、 Duplicate
. 次に、複製したインスタンスをクラスGridPanel
を使用するにドラッグByteSize
し、 のリストにドロップしColumns
ます。次に、複製された各インスタンスを他のインスタンスとは別に構成します。
のデフォルトまたは動作に対する変更は、ByteClass
すべてのインスタンスに自動的に影響します。
ロードマップ
これは、最小限実行可能な最初の実用的なソリューションであり、実行できる明らかな機能強化があります。たとえば、metaData.tdAttr
そこにあるものをやみくもに上書きするのではなく、既にコンテンツがある場合に追加する場所を修正したいと考えています。
拡張は、GitHub のこの Gist に対して行われます。