Extjs checkcolumn отключен для некоторых строк, основанный на значении
У меня есть сетка с checkcolumn. Он dataIndex, например, "проверен".
Я хочу отключить или скрыть флажки для некоторых строк, где другое значение "can_be_checked", например, false/empty.
Renderer уже определен в checkcolumn, возиться с ним прерывает создание флажка.
Как я могу это сделать?
Ответы
Ответ 1
Вы можете скрыть флажок только внутри средства визуализации, например:
column.renderer = function(val, m, rec) {
if (rec.get('can_be_checked') == 'FALSE'))
return '';
else
return (new Ext.ux.CheckColumn()).renderer(val);
};
Ответ 2
Я искал решение этого вопроса и наткнулся на этот вопрос, но ни одно работоспособное решение нигде не отображало флажок с отключенным, а не НЕТ, как описано в другом ответе. Это было похоже на участие, но вот что я сделал (для 4.1.0):
-
Я обнаружил, что файл extjs\examples\ux\css\CheckHeader.css, который
используется Ext.ux.CheckColumn
не имеет отключенного класса, поэтому я
пришлось изменить его, чтобы больше походить на стандартное оформление флажка
содержащийся в ext-all.css(который включает отключенный флажок
класс).
-
Мне пришлось расширять Ext.ux.CheckColumn
, чтобы предотвратить события
снятых с запрещенных флажков.
-
Наконец, я должен был предоставить свой собственный рендерер для применения отключенных
класс по моей логике.
Код выглядит следующим образом.
Измененный CheckHeader.css:
.x-grid-cell-checkcolumn .x-grid-cell-inner {
padding-top: 4px;
padding-bottom: 2px;
line-height: 14px;
}
.x-grid-with-row-lines .x-grid-cell-checkcolumn .x-grid-cell-inner {
padding-top: 3px;
}
.x-grid-checkheader {
width: 13px;
height: 13px;
background-image: url('../images/checkbox.gif');
background-repeat: no-repeat;
background-color: transparent;
overflow: hidden;
padding: 0;
border: 0;
display: block;
margin: auto;
}
.x-grid-checkheader-checked {
background-position: 0 -13px;
}
.x-grid-checkheader-disabled {
background-position: -39px 0;
}
.x-grid-checkheader-checked-disabled {
background-position: -39px -13px;
}
.x-grid-checkheader-editor .x-form-cb-wrap {
text-align: center;
}
Образец background-image выше указывает на это изображение, которое обычно поставляется с extjs 4.1.0 по адресу: extjs\resources\themes\images\default\form\checkbox.gif.
![extjs\resources\themes\images\default\form\checkbox.gif]()
Расширенный класс Ext.ux.CheckColumn, чтобы события не запускались из отключенных контрольных столбцов:
Ext.define('MyApp.ux.DisableCheckColumn', {
extend: 'Ext.ux.CheckColumn',
alias: 'widget.disablecheckcolumn',
/**
* Only process events for checkboxes that do not have a "disabled" class
*/
processEvent: function(type, view, cell, recordIndex, cellIndex, e) {
var enabled = Ext.query('[class*=disabled]', cell).length == 0,
me = this;
if (enabled) {
me.callParent(arguments);
}
},
});
Реализация с помощью настраиваемого средства визуализации для применения отключенного класса в соответствии с моей собственной логикой:
column = {
xtype: 'disablecheckcolumn',
text: myText,
dataIndex: myDataIndex,
renderer: function(value, meta, record) {
var cssPrefix = Ext.baseCSSPrefix,
cls = [cssPrefix + 'grid-checkheader'],
disabled = // logic to disable checkbox e.g.: !can_be_checked
if (value && disabled) {
cls.push(cssPrefix + 'grid-checkheader-checked-disabled');
} else if (value) {
cls.push(cssPrefix + 'grid-checkheader-checked');
} else if (disabled) {
cls.push(cssPrefix + 'grid-checkheader-disabled');
}
return '<div class="' + cls.join(' ') + '"> </div>';
}
};
Ответ 3
Используя extjs 5, проще вернуть defaultRenderer в метод renderer для целевых флажков и '' для других.
renderer: function (value, metaData, record) {
return (record.isLeaf()) ? '' : this.defaultRenderer(value, metaData);
}
Такой флажок не будет отображаться, но все события (т.е. checkchange, itemclick и т.д.) будут оставлены. Если вы также не хотите их, вы можете отключить их в beforesmth событии, например
onBeforeCheckRequestsChange: function(me, rowIndex, checked, eOpts) {
var row = me.getView().getRow(rowIndex),
record = me.getView().getRecord(row);
return !record.isLeaf();
},
Ответ 4
Я нашел решение проблемы с флажком, который нельзя щелкнуть, когда вы используете код Aniketos, вы должны убедиться, что в вашем коде столбца вы указываете xtype: 'checkcolumn, который сделает трюк
Ответ 5
Я также столкнулся с этой проблемой и, чтобы сделать это еще дальше, мне нужно было показать всплывающее окно всплывающей подсказки. Здесь решение, которое я придумал, кажется наименее инвазивным для существующего виджета checkcolumn...
renderer: function (value, metaData, record) {
// Add a tooltip to the cell
metaData.tdAttr = (record.get("someColumn") === "") ? 'data-qtip="A tip here"' : 'data-qtip="Alternate tip here"';
if (record.get("someColumn") === "") {
metaData.tdClass += " " + this.disabledCls;
}
// Using the built in defaultRenderer of the checkcolumn
return this.defaultRenderer(value, metaData);
}