【问题标题】:ExtJs - Checkbox selection model, disable checkbox per rowExtJs - 复选框选择模型,每行禁用复选框
【发布时间】:2013-12-07 03:23:13
【问题描述】:

我有一个带有复选框选择模型的网格。

Ext.define('Mb.view.ship.OrdersGrid', {
    extend: 'Ext.grid.Panel',
    selType: 'checkboxmodel',
    selModel: {
        injectCheckbox: 0,
        pruneRemoved: false
    },
    ...

根据字段中的值,有些行是不可选择的。

在普通列中,我可以用renderer干预显示并用css(metadata.tdCls)隐藏单元格内容,但是对于自动生成的复选框列,我找不到禁用或隐藏复选框的方法以行为基础。

有人知道怎么做吗?

【问题讨论】:

  • @rixo 不,这不是一个重复的问题。在 ExtJs 中有一个列类型 checkcolumn 和一个名为 checkboxmodel 的选择模型。我的问题是指后者,而另一个问题是指第一个。
  • 你说得对,抱歉我没看到。

标签: extjs checkbox selectionmodel extjs-grid


【解决方案1】:

在 ExtJS 6 中,覆盖 renderer工作。

您可以通过使用 getRowClass 定义 viewConfig 来解决这个问题:

            getRowClass: function(record) {
                var classes = '';
                if (!record.get('available')) {
                    classes += ' selection-disabled';
                }
                return classes;
            }

然后在你的 CSS 中添加:

.selection-disabled .x-selmodel-column {
    visibility: hidden;
}

这将隐藏选择复选框。

现在要通过单击一行来禁用选择,请使用标准方法。 IE。将beforeselect 添加到listenersselModel

        selModel: {
            selType: 'checkboxmodel',
            showHeaderCheckbox: false,
            listeners: {
                beforeselect: function(grid, record) {
                    if (!record.get('available')) {
                        return false;
                    }
                }
            }
        },

【讨论】:

  • 根据您的回答,我创建了这个小提琴:fiddle.sencha.com/#view/editor&fiddle/3evu。虽然我不知道为什么通过单击列标题中的复选框来清除所有选择不起作用(我让它可见)。我必须弄清楚。
  • @costa 似乎 ExtJS 检查并非所有行都被选中并且不允许您取消选择。不确定您是否可以在不覆盖的情况下解决此问题。我想此时 Sencha 会以某种方式支持这个案例。
【解决方案2】:

CheckboxSelectionModel 也有一个renderer

var sm = new Ext.grid.CheckboxSelectionModel({
        checkOnly : true,
        renderer : function(v,p,record) {
        // First condition : show
        if (record.data.XXX == 'YYYY') return '<div class="x-grid3-row-checker">&nbsp;</div>';
        // else hide 
        else return '';
    },
    header: ''
});

https://www.sencha.com/forum/showthread.php?122496-How-to-hide-certain-checkbox-in-a-CheckboxSelectionModel

返回空的'' 也会禁用复选框选择,不仅可以隐藏它,还可以将unselectable="on" 添加到父div。

不知道如何在 Ext.define 中执行此操作(从不需要扩展),但似乎可行。

更新:尽管有unselectable="on",但单击行(如果启用)或使用标题复选框(全选)将选择“禁用”行。那么实现一个监听器可能是个好主意。

【讨论】:

    【解决方案3】:

    您只需使用网格的beforeselect 事件。返回 false,将不允许选择。检查the documentation

    Ext.define('Mb.view.ship.OrdersGrid', {
        extend: 'Ext.grid.Panel',
        selType: 'checkboxmodel',
        selModel: {
            injectCheckbox: 0,
            pruneRemoved: false
        },
    
        listeners: {
    
            beforeselect: function(grid, record, index, eOpts) {
                if (record.get('yourProperty')) {//replace this with your logic.
                    return false;
                }
            }
    
    }
    ..........
    

    如果你真的想隐藏复选框,你可以为你的网格行添加 CSS 类,使用它们你可以隐藏它们。检查this answer 以获得解决方案。

    【讨论】:

    • 谢谢,这已经是部分解决方案了。但是用户不知道是否可以不点击进行选择。应该有一个视觉指示器来显示是否可以选择。
    • 是的,但是如何设置复选框以使其在视觉上处于disabled 状态?
    • 虚拟是什么意思?如果您的意思是 HTML,那么...为什么需要它?
    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    相关资源
    最近更新 更多