このJSONサンプルを検討してください:
[{id:1,editable:true},{id:2,editable:false}]
これらのレコードはストアに読み込まれ、グリッドパネル内に表示されます。このグリッドには、エディション用のアクション列アイテムがあります。レンダリング後に計算を実行せずに、2行目のみの[編集]ボタンを無効にする方法を探しています。グリッドがレンダリングされたら、ストアをループして各行を更新するのではなく、 renderer
プロパティのように機能する組み込み機能を使用したいと思います。
ExtJS 4.1.1はこの種の機能を提供しますか?
ルイが彼の答えを投稿するまで、私はこの質問を忘れていました。私はついにActionColumnをオーバーライドして、不足している機能を追加することにしました。コードは次のとおりです。
Ext.grid.column.Action.override({
defaultRenderer: function (v, meta) {
var me = this,
disabled, tooltip,
prefix = Ext.baseCSSPrefix,
scope = me.origScope || me,
items = me.items,
len = items.length,
i = 0,
item;
v = Ext.isFunction(me.origRenderer) ? me.origRenderer.apply(scope, arguments) || '' : '';
meta.tdCls += ' ' + Ext.baseCSSPrefix + 'action-col-cell';
for (; i < len; i++) {
item = items[i];
disabled = item.disabled || (item.isDisabled ? item.isDisabled.apply(item.scope || scope, arguments) : false);
tooltip = disabled ? null : (item.tooltip || (item.getTip ? item.getTip.apply(item.scope || scope, arguments) : null));
if (!item.hasActionConfiguration) {
item.stopSelection = me.stopSelection;
item.disable = Ext.Function.bind(me.disableAction, me, [i], 0);
item.enable = Ext.Function.bind(me.enableAction, me, [i], 0);
item.hasActionConfiguration = true;
}
v += '<img alt="' + (item.altText || me.altText) + '" src="' + (item.icon || Ext.BLANK_IMAGE_URL) +
'" class="' + prefix + 'action-col-icon ' + prefix + 'action-col-' + String(i) + ' ' + (disabled ? prefix + 'item-disabled' : ' ') +
' ' + (Ext.isFunction(item.getClass) ? item.getClass.apply(item.scope || scope, arguments) : (item.iconCls || me.iconCls || '')) + '"' +
(tooltip ? ' data-qtip="' + tooltip + '"' : '') + ' />';
}
return v;
}
});
IsDisabled構成の設定を使用できます(少なくともバージョン4.2.1以降)。
{
xtype:'actioncolumn',
width:20,
items: [
{
icon: 'app/images/edit.png',
tooltip: 'Edit this row',
handler: function(gridview, rowIndex, colIndex, item, e, record, row) {
var grid=gridview.up('grid');
// You need to listen to this event on your grid.
grid.fireEvent('editRecord', grid, record);
},
isDisabled: function(view, rowIndex, colIndex, item, record) {
// Returns true if 'editable' is false (, null, or undefined)
return !record.get('editable');
}
]
}
IsDisabled(..)がtrueを返すと、アイコンがぼやけ、マウスクリックでハンドラーがトリガーされません。
私はこれを言うことから始めます:私は絶対にアクション列を使用することを避けます、それはどんな種類のレンダリングロジックも完全に行うことができません(行ごとに異なる画像、そして行モデルに基づいて条件付きで表示するなど)。代わりに、画像をレンダリングし、列のクリックイベントを利用する通常の列を定義します。これが私のコードの例です:
{
header: " ",
dataIndex: "some_index",
width: 26,
renderer: function(value, metaData){
metaData.style += "padding:0px;";
if(value)
return " <img src=\"extjs/4.0/sms/icons/fam/magnifier.png\"/>";
return value;
},
listeners: {
click: function(gridView, htmlSomething, rowIndex, columnIndex, theEvent){
var store = myGrid.getStore();
var record = store.getAt(rowIndex);
if(record.get("some_index"))
//do action
}
}
}
Senchaフォーラムで次の解決策を見つけました。ここですでに説明した「isDisabled」機能に加えて、次の設定を使用して、レコードに応じて表示するアイコンを変更(または非表示)できます。
getClass: function(value,metadata,record){
if (record.get('description')){ //read your condition from the record
return 'icon-pencil-go'; // add a CSS-Class to display what icon you like
} else {
return ''; //add no CSS-Class
}
}
私のCSSクラスは次のように定義されています。
.icon-pencil-go {
background-image: url('../images/icons/famfamfam/pencil_go.png') !important;
}
とにかくCSSを介してアイコンを表示しているので、これはアイコンを動的に変更するための高速な方法です。アイコンが表示されていなくても、アクション列をクリックするとハンドラーが起動するため、「isDisabled」を使用してハンドラーを無効にする必要があることに注意してください。
私はExtJs6.0.1バージョンで以下を使用し、うまく機能します。 'getClass'構成を使用します。アイコン画像に適用するCSSクラスを返す関数。
{
xtype: 'actioncolumn',
flex: 1,
text: 'Action'
items: [{
tooltip: 'Import',
getClass: function (value, meta, record) {
if(record.get('Name') == 'disable'){
return 'x-hidden'; // when u want to hide icon
}
}
return 'x-grid-icon' ; // show icon
}]
}