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

setDisabled是否已弃用?formContext.ui.tabs.get(...).setDisabled报错排查

问题分析与解决方案

为什么会报错?

formContext.ui.tabs.get(...).setDisabled is not a function 这个错误的核心原因是:Dynamics 365的标签页(Tab)对象从来没有提供过setDisabled方法,网上的示例大概率是混淆了字段/控件的方法(控件确实有setDisabled),或者是错误的传谣内容。

当你删除所有setDisabled相关代码后,剩下的setVisible是标签页支持的合法方法,所以脚本能正常执行。

实现“禁用标签页”的替代方案

如果你的需求是让用户无法编辑某个标签页的内容,或者无法切换到该标签页,可以用以下两种方式实现:

方案1:直接隐藏标签页(最简单)

如果不需要标签页可见,直接用setVisible(false)隐藏即可,这也是你原本代码里已经在使用的方式,完全能达到用户无法访问的效果。

方案2:保持标签页可见,但禁止切换/编辑内容

如果必须让标签页显示,但不让用户切换过去或编辑内容,可以通过以下两步实现:

  1. 禁用标签页内的所有控件:遍历标签页下的所有区域(Section),再遍历每个区域内的控件,逐个设置禁用。
  2. 阻止标签页切换事件:给目标标签页添加状态变更事件,当用户尝试切换时阻止默认行为。

下面是修改后的完整脚本,替换了你原来的setDisabled调用:

function HideAndDisableTabsBasedOnBPFStage(executionContext) {
    var formContext = executionContext.getFormContext();
    
    // 工具函数:禁用标签页内的所有控件+阻止切换
    function disableTabControls(tabName) {
        var tab = formContext.ui.tabs.get(tabName);
        if (!tab) return;
        // 遍历标签页下的所有区域
        var sections = tab.sections.get();
        sections.forEach(function(section) {
            // 遍历区域内的所有控件
            var controls = section.controls.get();
            controls.forEach(function(control) {
                if (control.setDisabled) {
                    control.setDisabled(true);
                }
            });
        });
        // 阻止切换到该标签页
        tab.addTabStateChange(function(e) {
            e.preventDefault();
        });
    }

    // 工具函数:启用标签页内的所有控件
    function enableTabControls(tabName) {
        var tab = formContext.ui.tabs.get(tabName);
        if (!tab) return;
        // 遍历标签页下的所有区域
        var sections = tab.sections.get();
        sections.forEach(function(section) {
            // 遍历区域内的所有控件
            var controls = section.controls.get();
            controls.forEach(function(control) {
                if (control.setDisabled) {
                    control.setDisabled(false);
                }
            });
        });
    }

    // 根据当前BPF阶段处理标签页
    var bpfStageId = formContext.data.process.getActiveStage().getId();
    switch (bpfStageId) {
        case "abbda151-be8f-462a-99b9-b32231baadaf":
            formContext.ui.tabs.get("tab_Requestor").setVisible(true);
            enableTabControls("tab_Requestor");
            formContext.ui.tabs.get("tab_CourtApprover").setVisible(false);
            formContext.ui.tabs.get("tab_JBSIS").setVisible(false);
            formContext.ui.tabs.get("tab_CTS").setVisible(false);
            formContext.ui.tabs.get("tab_Finance").setVisible(false);
            formContext.ui.tabs.get("tab_CTSEntry").setVisible(false);
            break;
        case "ea3aa60c-f952-4edb-b955-c78c2cebc3a6":
            formContext.ui.tabs.get("tab_Requestor").setVisible(true);
            enableTabControls("tab_Requestor");
            formContext.ui.tabs.get("tab_CourtApprover").setVisible(true);
            enableTabControls("tab_CourtApprover");
            formContext.ui.tabs.get("tab_JBSIS").setVisible(false);
            formContext.ui.tabs.get("tab_CTS").setVisible(false);
            formContext.ui.tabs.get("tab_Finance").setVisible(false);
            formContext.ui.tabs.get("tab_CTSEntry").setVisible(false);
            break;
        case "0d92ffa6-786d-4e4b-b790-695f4495c7a7":
            formContext.ui.tabs.get("tab_Requestor").setVisible(true);
            enableTabControls("tab_Requestor");
            formContext.ui.tabs.get("tab_CourtApprover").setVisible(true);
            enableTabControls("tab_CourtApprover");
            formContext.ui.tabs.get("tab_JBSIS").setVisible(false);
            formContext.ui.tabs.get("tab_CTS").setVisible(false);
            formContext.ui.tabs.get("tab_Finance").setVisible(false);
            formContext.ui.tabs.get("tab_CTSEntry").setVisible(false);
            break;
        case "bdcfd44f-6b69-47ef-9785-a7a3c029169c":
            formContext.ui.tabs.get("tab_Requestor").setVisible(true);
            disableTabControls("tab_Requestor");
            formContext.ui.tabs.get("tab_CourtApprover").setVisible(true);
            disableTabControls("tab_CourtApprover");
            formContext.ui.tabs.get("tab_JBSIS").setVisible(true);
            enableTabControls("tab_JBSIS");
            formContext.ui.tabs.get("tab_CTS").setVisible(false);
            formContext.ui.tabs.get("tab_Finance").setVisible(false);
            formContext.ui.tabs.get("tab_CTSEntry").setVisible(false);
            break;
        case "bccdfa2d-831a-4f4e-a370-c0d3b130914b":
            formContext.ui.tabs.get("tab_Requestor").setVisible(true);
            disableTabControls("tab_Requestor");
            formContext.ui.tabs.get("tab_CourtApprover").setVisible(true);
            disableTabControls("tab_CourtApprover");
            formContext.ui.tabs.get("tab_JBSIS").setVisible(false);
            formContext.ui.tabs.get("tab_CTS").setVisible(false);
            formContext.ui.tabs.get("tab_Finance").setVisible(true);
            enableTabControls("tab_Finance");
            formContext.ui.tabs.get("tab_CTSEntry").setVisible(false);
            break;
        case "fcfaceed-fc37-4dde-9351-f8942fe2b73f":
            formContext.ui.tabs.get("tab_Requestor").setVisible(true);
            disableTabControls("tab_Requestor");
            formContext.ui.tabs.get("tab_CourtApprover").setVisible(true);
            disableTabControls("tab_CourtApprover");
            formContext.ui.tabs.get("tab_JBSIS").setVisible(false);
            formContext.ui.tabs.get("tab_CTS").setVisible(true);
            enableTabControls("tab_CTS");
            formContext.ui.tabs.get("tab_Finance").setVisible(false);
            formContext.ui.tabs.get("tab_CTSEntry").setVisible(false);
            break;
        case "f712096e-f750-4b6e-a10e-0e8d3184387e":
            formContext.ui.tabs.get("tab_Requestor").setVisible(true);
            disableTabControls("tab_Requestor");
            formContext.ui.tabs.get("tab_CourtApprover").setVisible(true);
            disableTabControls("tab_CourtApprover");
            formContext.ui.tabs.get("tab_JBSIS").setVisible(true);
            disableTabControls("tab_JBSIS");
            formContext.ui.tabs.get("tab_CTS").setVisible(true);
            disableTabControls("tab_CTS");
            formContext.ui.tabs.get("tab_Finance").setVisible(true);
            disableTabControls("tab_Finance");
            formContext.ui.tabs.get("tab_CTSEntry").setVisible(true);
            enableTabControls("tab_CTSEntry");
            break;
        default:
            break;
    }
}

// 绑定加载和阶段变更事件
Xrm.Page.data.process.addOnLoad(HideAndDisableTabsBasedOnBPFStage);
Xrm.Page.data.process.addOnStageChange(HideAndDisableTabsBasedOnBPFStage);

额外说明

  • 不存在“标签页setDisabled方法被弃用”的说法,因为这个方法从来就没出现在官方的Tab对象API中。
  • 如果你不需要阻止标签页切换,只需要禁用内容,那可以去掉addTabStateChange的部分,只保留禁用控件的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 10:52:59