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

Ext JS中如何通过控制器方法动态隐藏/显示表格操作按钮

问题:ActionColumn中动态隐藏按钮失效,isActionDisabled正常但hidden始终为true

我尝试通过控制器方法动态隐藏/显示网格ActionColumn中的按钮,当前isActionDisabled能正常工作,但hidden属性始终返回true,无论修改函数返回值。以下是相关代码:

网格操作配置

actions: {
    run: {
        iconCls: 'u4f-backgroundjobs-start-icon',
        tooltip: U4.Titles.getTitle(20637, 'Run'),
        handler: 'onRunClick',
        isActionDisabled: 'isRunDisabled'
    },
    pause: {
         xtype: 'u4_button',
         iconCls: 'u4f-backgroundjobs-pause-icon',
         padding: 0,
         width: 15,
         height: 15,
         tooltip: U4.Titles.getTitle(60600, 'Hold'),
         handler: 'onPauseClick',
         hidden: 'isPauseHidden'
    },
    kill: {
        iconCls: 'u4f-backgroundjobs-kill-icon',
        tooltip: U4.Titles.getTitle(39340, 'Terminate'),
        handler: 'onKillClick',
        isActionDisabled: 'isKillDisabled'
    },
    resume: {
        xtype: 'u4_button',
        iconCls: 'u4f-backgroundjobs-resume-icon',
        padding: 0,
        width: 15,
        height: 15,
        handler: 'onResumeClick',
        hidden: 'isResumeHidden'
    }
},

ActionColumn列配置

{
    text: U4.Titles.getTitle(47035, 'Actions'),
    menuDisabled: true,
    sortable: false,
    xtype: 'actioncolumn',
    flex: 2,
    items: ['@run', '@pause', '@resume', '@kill'],
    draggable: false,
    resizable: false,
    align: 'center'
},

控制器对应方法

isRunDisabled: function (grid, rowIndex) {
    var me = this,
        gridStore = grid.getStore(),
        storedTask = gridStore.getAt(rowIndex),
        jobCanRunOnDemand = storedTask.get('canRunOnDemand');

    return me.jobIsRunning(grid, rowIndex) || !jobCanRunOnDemand;
},

isResumeHidden: function (grid, rowIndex) {
    var me = this,
        gridStore = grid.getStore(),
        storedTask = gridStore.getAt(rowIndex),
        jobStatus = storedTask.get('jobStatus'),
        activeToTime = storedTask.get('activeToTime'),
        currentTime = new Date();

    return jobStatus === 0 || activeToTime < currentTime;
},

问题原因

ActionColumn的isActionDisabled是框架专门提供的行级回调配置,支持传入控制器方法名字符串并自动执行;但你给自定义按钮设置的hidden属性,框架并不会自动解析为控制器方法调用——它只会把字符串'isResumeHidden'当作布尔值处理(非空字符串在JS中会被转为true),所以按钮始终隐藏。


解决方法

方法1:使用isActionHidden配置(推荐)

如果你的ExtJS版本(或所用框架)支持ActionColumn的isActionHidden配置,直接替换hidden为该属性即可,用法和isActionDisabled完全一致:

pause: {
     xtype: 'u4_button',
     iconCls: 'u4f-backgroundjobs-pause-icon',
     padding: 0,
     width: 15,
     height: 15,
     tooltip: U4.Titles.getTitle(60600, 'Hold'),
     handler: 'onPauseClick',
     isActionHidden: 'isPauseHidden' // 替换hidden为isActionHidden
},
resume: {
    xtype: 'u4_button',
    iconCls: 'u4f-backgroundjobs-resume-icon',
    padding: 0,
    width: 15,
    height: 15,
    handler: 'onResumeClick',
    isActionHidden: 'isResumeHidden' // 替换hidden为isActionHidden
}

方法2:通过ActionColumn的renderer手动控制

如果框架不支持isActionHidden,可以在ActionColumn的renderer中手动处理按钮的显示隐藏:

{
    text: U4.Titles.getTitle(47035, 'Actions'),
    menuDisabled: true,
    sortable: false,
    xtype: 'actioncolumn',
    flex: 2,
    items: ['@run', '@pause', '@resume', '@kill'],
    draggable: false,
    resizable: false,
    align: 'center',
    renderer: function(value, metaData, record, rowIndex, colIndex, store, view) {
        // 调用默认renderer生成按钮HTML
        var html = this.callParent(arguments);
        var controller = this.lookupController();
        
        // 判断当前行是否要隐藏按钮
        var hidePause = controller.isPauseHidden(view.grid, rowIndex);
        var hideResume = controller.isResumeHidden(view.grid, rowIndex);
        
        // 给对应按钮添加隐藏类(假设你的CSS中有.hidden{display:none;})
        if(hidePause) {
            html = html.replace('u4f-backgroundjobs-pause-icon', 'u4f-backgroundjobs-pause-icon hidden');
        }
        if(hideResume) {
            html = html.replace('u4f-backgroundjobs-resume-icon', 'u4f-backgroundjobs-resume-icon hidden');
        }
        
        return html;
    }
}

方法3:MVVM绑定(适合支持绑定的场景)

如果你的项目使用MVVM模式,可以通过绑定表达式直接关联记录字段或视图模型方法:

resume: {
    xtype: 'u4_button',
    iconCls: 'u4f-backgroundjobs-resume-icon',
    padding: 0,
    width: 15,
    height: 15,
    handler: 'onResumeClick',
    hidden: '{!record.canResume}' // 绑定到记录的canResume字段,或视图模型方法
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:47:06