我有一个网格,带有校验列。例如,它的 dataIndex 是“已检查”。
我想禁用或隐藏某些行的复选框,其中另一个值(例如“can_be_checked”)为假/空。
渲染器已经在 checkcolumn 中定义,弄乱它会破坏复选框的生成。
我该怎么做?
您可以在渲染器中隐藏复选框,例如:
column.renderer = function(val, m, rec) {
if (rec.get('can_be_checked') == 'FALSE'))
return '';
else
return (new Ext.ux.CheckColumn()).renderer(val);
};
我一直在寻找解决方案并遇到了这个问题,但是在任何地方都没有可行的解决方案来显示禁用的复选框,而不是其他答案中涵盖的 NO 复选框。这有点涉及,但这是我所做的(对于 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;
}
上面的背景图片 url 指向这个通常随 extjs 4.1.0 一起提供的图片: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>';
}
};
使用 extjs 5 更容易在渲染器方法中为目标复选框返回 defaultRenderer,为其他复选框返回 ''。
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();
},
我找到了使用 Aniketos 代码时无法单击复选框问题的解决方案,您必须确保在列的代码中指定 xtype: 'checkcolumn,这样可以解决问题
我也遇到了这个问题,为了更进一步,我需要在复选框上显示一个工具提示。这是我想出的解决方案,它似乎对现有的 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);
}