You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ExtJs网格列编辑器combobox不使用私有blur方法实现失焦触发validateedit

解决方案

你可以使用ExtJS公开的官方API实现需求,不需要调用私有blur()方法,两种常用合规实现方式如下:

方案1:主动结束单元格编辑(推荐)

你要触发validateedit的本质是要结束当前单元格的编辑状态,直接调用cellediting插件的公开方法completeEdit()即可,这个方法会自动执行编辑器失焦、校验、提交值的全流程,完全符合你的需求。
修改combobox的select/change事件监听代码即可:

listeners: {
    blur: function () {
        console.log("blurred");
    },
    // 用select事件更贴合下拉选择的场景,也可以保留change事件
    select: function(combo) {
        console.log('选择完成');
        // 获取当前grid的cellediting插件实例,调用完成编辑方法
        const cellEditing = combo.up('grid').getPlugin('cellediting');
        cellEditing.completeEdit();
    }
}

注意要给cellediting插件加个id方便获取实例,修改插件配置:

plugins: {
    cellediting: {
        id: 'cellediting', // 新增id配置
        clicksToEdit: 1,
        listeners: {
            validateedit: function () {
                console.log("validated")
            }
        }
    }
}

方案2:仅主动触发校验不需要结束编辑

如果你不需要结束编辑状态,只是要值变化时立刻执行校验逻辑,也可以直接调用编辑器的validate()方法,或者手动触发validateedit事件:

change: function(combo, newValue) {
    console.log('值变更');
    // 直接执行字段校验
    const isValid = combo.validate();
    // 也可以手动触发validateedit事件
    const cellEditing = combo.up('grid').getPlugin('cellediting');
    const context = cellEditing.getContext();
    cellEditing.fireEvent('validateedit', cellEditing, context);
}

完整可运行代码(修改后)

Ext.application({
    name: 'Fiddle',

    launch: function () {
        Ext.create('Ext.data.Store', {
            storeId: 'simpsonsStore',
            fields: ['name', 'email', 'phone'],
            data: [{
                name: 'Lisa',
                email: 'lisa@simpsons.com',
                phone: '555-111-1224'
            }, {
                name: 'Bart',
                email: 'bart@simpsons.com',
                phone: '555-222-1234'
            }, {
                name: 'Homer',
                email: 'homer@simpsons.com',
                phone: '555-222-1244'
            }, {
                name: 'Marge',
                email: 'marge@simpsons.com',
                phone: '555-222-1254'
            }]
        });

        Ext.create('Ext.grid.Panel', {
            title: 'Simpsons',
            store: Ext.data.StoreManager.lookup('simpsonsStore'),
            columns: [{
                header: 'Email',
                dataIndex: 'email',
                flex: 1,
                getEditor: function () {
                    return {
                        validateOnChange: false,
                        validateOnBlur: false,
                        xtype: 'combobox',
                        allowBlank: false,
                        displayField: "name",
                        listeners: {
                            blur: function () {
                                console.log("blurred");
                            },
                            select: function(combo) {
                                console.log('选择完成');
                                const cellEditing = combo.up('grid').getPlugin('cellediting');
                                cellEditing.completeEdit();
                            }
                        },
                        store: {
                            data: [{
                                name: "A"
                            }, {
                                name: "B"
                            }, {
                                name: "C"
                            }, {
                                name: "D"
                            }]
                        }
                    }
                }
            }],
            selModel: 'cellmodel',
            plugins: {
                cellediting: {
                    id: 'cellediting',
                    clicksToEdit: 1,
                    listeners: {
                        validateedit: function () {
                            console.log("validated")
                        }
                    }
                }
            },
            height: 200,
            width: 400,
            renderTo: Ext.getBody()
        });
    }
});

内容的提问来源于stack exchange,提问作者wahab memon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 20:45:07