我有一个允许我从OptionSetValue字段中过滤掉某些选项的方法。
它在表单字段上工作正常,但是当该字段在标题中时,对于业务流程流,它“工作”,如通过调试我看到清除并重新添加的选项(只有那些应该在那里),但一旦表格被渲染,所有选项都是可见的......
以下是方法:
FilterOptionSetValues: function (fieldName, visibleOptions) {
var ctrl = Xrm.Page.getControl(fieldName);
var allOptions = ctrl.getOptions();
//clear current options
ctrl.clearOptions();
//loop through all options of optionset and if one is found in config element, add it.
for (var x = 0; x <= allOptions.length - 1; x++) {
if (visibleOptions.availableOptions.indexOf(parseInt(allOptions[x].value)) > -1) {
ctrl.addOption(allOptions[x]);
}
}
}
以下是我的称呼方式:
FilterOptionSetValues('header_process_new_my_optionset_field', { stage: 1, availableOptions: [300000002, 300000003, 300000004] });
此代码在表单load事件和其他字段的OnChange事件(salesstage)中调用。
有什么我想念的吗?好像MS自己的javascript正在撤消我的工作......
编辑:当我在OnChange
上放置一个header_process_new_my_optionset_field
侦听器时,当我在标头业务流程流中更改该字段的值时,没有任何反应,但onChange
监听器在{new_my_optionset_field
上1}}将由表单或标题业务流程上的该字段的更改触发。
但仅在字段new_my_optionset_field
上运行上述逻辑不会对业务流程中的相同字段进行过滤。
答案 0 :(得分:0)
通过执行所有表单控件(console.log
)的Xrm.Page.ui.getControls().getAll()
名称,我发现在该过程的每个阶段都有该属性的控件实例,其次是1,2,3等。业务流程的所有阶段都存在相同的字段。
所以我改变了上面的代码:
var control = Xrm.Page.getControl(fieldName);
var allOptions = control.getAttribute().getOptions();
//clear current options
control.clearOptions();
//below, same as above...
并为所有人打电话:
FilterOptionSetValues('header_process_new_my_optionset_field', { stage: 1, availableOptions: [300000002, 300000003, 300000004] });
FilterOptionSetValues('header_process_new_my_optionset_field1', { stage: 1, availableOptions: [300000002, 300000003, 300000004] });
FilterOptionSetValues('header_process_new_my_optionset_field2', { stage: 1, availableOptions: [300000002, 300000003, 300000004] });
//and so on...
它起初工作,但只是在流程的第一阶段过滤选项,这在测试时不是活动阶段,因此给人的印象是不工作......
答案 1 :(得分:0)
每当您更改当前的BPF阶段(未选择,但实际上进入下一阶段)时,它会强制进行CRM保存。这可能会刷新您的选项集。添加一个Xrm.Page.data.process.addOnStageChange事件处理程序,然后在其中运行过滤器。