Dynamics 365表单中按状态动态过滤Option Set选项的JS问题
解决Dynamics 365 Option Set动态控制可用选项失效问题
你的代码核心问题是直接修改了字段属性(Attribute)的选项对象,而非表单控件(Control)的UI选项。Dynamics 365中,Attribute负责字段的数据定义,而Control才是控制前端显示的载体,修改Attribute的选项不会同步到UI。
修改后的代码
function setStatusoptions(executionContext) { var formContext = executionContext.getFormContext(); // 获取字段控件(而非仅属性) var statusControl = formContext.getControl("new_status"); var statusField = formContext.getAttribute("new_status"); var currentStatus = statusField.getValue(); var allowedOptionValues = []; console.log("currentstat=" + currentStatus); if (currentStatus === 717800000) { allowedOptionValues = [717800001, 717800002]; } else if (currentStatus === 717800001) { allowedOptionValues = [717800002, 717800003]; } console.log(allowedOptionValues); // 先清除所有选项的禁用状态,避免残留 statusControl.clearDisabledOptions(); // 遍历所有选项,通过控件方法设置禁用 var options = statusField.getOptions(); for (var i = 0; i < options.length; i++) { var option = options[i]; // 不在允许列表中的选项禁用 var isDisabled = allowedOptionValues.indexOf(option.value) === -1; statusControl.setDisabledOption(option.value, isDisabled); } }
关键修改点
- 替换仅操作
formContext.getAttribute("new_status")的逻辑,改用formContext.getControl("new_status")获取控件实例 - 使用控件的
clearDisabledOptions()方法重置之前的禁用状态,避免多次触发后状态混乱 - 通过控件的
setDisabledOption(optionValue, isDisabled)方法控制UI层面的选项禁用,这是Dynamics 365官方支持的API
额外注意事项
- 确保该函数不仅绑定到表单加载事件,还要绑定到
new_status字段的OnChange事件,这样状态变化时能实时更新可用选项 - 确认
new_status字段在表单中是可编辑状态,如果字段本身被禁用,控制选项的操作也不会生效
内容的提问来源于stack exchange,提问作者Cool Tuck
相关产品推荐
相关产品推荐

