Dynamics 365无选项时隐藏flyout按钮No Options Available提示
Dynamics 365 隐藏空Flyout控件"No Options Available"提示方案
方案1:官方API实现(优先推荐,稳定性100%)
核心逻辑是在判断无可用菜单项时,直接通过客户端API控制Flyout父按钮的状态,从根源避免用户点击后弹出空提示,完全不需要修改DOM:
- 原逻辑只判断是否往
menuXml插入按钮节点,现在需要把API返回的判断结果同步复用,控制父按钮属性 - 参考实现代码:
/** * Flyout按钮动态初始化逻辑 * @param {Xrm.FormContext} formContext 表单上下文 */ async function initFlyoutMenu(formContext) { // 替换成你自己的业务API调用逻辑,返回是否存在可展示的菜单项 const hasValidMenuItems = await fetchMenuAvailability(); const flyoutControl = formContext.getControl("your_custom_flyout_control_name"); if (!hasValidMenuItems) { // 无可用选项时直接隐藏父按钮,也可根据业务需求换成setDisabled(true)禁用按钮 flyoutControl.setVisible(false); return; } // 原有动态拼接菜单XML的逻辑 let menuXml = `<Menu><Root>`; // ... 此处为你原有的拼接各按钮节点的逻辑 menuXml += `</Root></Menu>`; // 给控件绑定生成的菜单 flyoutControl.setMenu(menuXml); // 确认有菜单项时再把按钮设为可见 flyoutControl.setVisible(true); }
方案2:DOM拦截兜底方案(非官方支持,仅用于必须保留按钮可见的场景)
如果业务要求无菜单项时Flyout父按钮必须保持可见、不能隐藏或禁用,可以通过全局监听DOM渲染的方式拦截空提示弹出层:
- 核心逻辑是监听页面DOM变化,识别到内容为"No Options Available"的Flyout弹出层时直接隐藏,可搭配自定义提示告知用户当前无可用操作
- 参考实现代码:
/** * 表单加载时绑定空Flyout提示隐藏逻辑 */ function bindEmptyFlyoutHiderOnLoad() { // 防止重复绑定监听 if (window._flyoutEmptyTipBinded) return; window._flyoutEmptyTipBinded = true; const domObserver = new MutationObserver(() => { // 匹配UCI框架下的Flyout弹出层容器 const allFlyouts = document.querySelectorAll('[data-id*="FlyoutDialog"]'); allFlyouts.forEach(flyoutEl => { const content = flyoutEl.textContent?.trim(); if (content === "No Options Available") { flyoutEl.style.display = "none"; // 可选:弹出自定义业务提示 // Xrm.Navigation.openAlertDialog({text: "当前无可用操作项"}); } }); }); domObserver.observe(document.body, { childList: true, subtree: true }); }
注意:方案2依赖UCI前端页面的DOM结构,不属于微软官方支持的自定义扩展范畴,每次Dynamics 365版本迭代后需要验证逻辑有效性,生产环境优先使用方案1。
内容的提问来源于stack exchange,提问作者Gokul Ganesan
相关产品推荐
相关产品推荐

