我接受了下一个合乎逻辑的结论的答案:
并将其制成完整的基于可配置plugin
的解决方案,只需要很少的配置即可使用。并与 Sencha Architect 配合得很好。
动机
研究这个并让它工作的主要动机是,DateColumn
将renderer
配置参数标记为,hidden
以便 Sencha Architect 不允许您在Config
面板中修改它。我理解为什么,它驱使我找到这个解决方案,我认为这是正确的解决方案,从长远来看是最可维护和可重用的。
在撰写本文时:
我正在使用 Sencha Architect 3.x 和 ExtJS 4.2.2,这些说明包括如何在该环境中应用这些功能。如果您不使用 Sencha Architect,您只需要自己创建和管理文件。在处理任何大小的 ExtJS 项目时,我发现它非常有效率。
首先是实际的GridPlugin
:
将 a 添加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;
}
});
这是您如何将其应用于 a 的方法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
。
这里的函数实现很短,而且只有一行。这只是一个例子,为了简洁起见。
工具提示功能说明:
createdOn
ToolTip
为其中的每个添加一个Cell
作为Column
时间UTC
。
byteSize
ToolTip
为每个添加一个将原始字节Cell
数Column
显示为详细信息的内容。
然后它将已配置插件的实例添加到config
的GridPanel
并返回 的实例config
。
奖金班
在 Sencha Architect 中,我创建了一个Column
来表示Size
of 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;
}
});
现在 this 的原始实例Column
指向这个 new Class
:
columns: [
{
xtype: 'byteSize',
itemId: 'byteSize'
}
]
现在要GridPanel
在 Sencha Architect 的其他实例中使用它,只需右键单击Column
链接到这个新类的实例并选择Duplicate
. 然后将复制的实例拖到GridPanel
您要使用的ByteSize
类并将其放入Columns
. 然后独立配置每个克隆实例。
对默认值或行为的任何更改ByteClass
都会自动影响所有实例。
路线图
这是第一个可行的最小可行解决方案,可以进行明显的改进。例如,如果已经有内容,我想将其修复到附加的位置,metaData.tdAttr
而不是盲目地覆盖那里的内容。
将在 GitHub 上对此 Gist 进行任何增强。