首页 > 解决方案 > executionContext 与 primaryControl

问题描述

我在两种情况下使用相同的代码时遇到问题:

  1. 从功能区按钮调用revisionRequested依次调用removeOptions
  2. 从 OnLoad 表单中,仅调用removeOptions

下面的代码是我的工作,但我最初尝试的是将primaryControl参数从我制作的formContext = primaryControlrevisionRequested传递给我得到了一个错误。removeOptions

    function revisionRequested(primaryControl) {
    
        var formContext = primaryControl;
        formContext.getAttribute("statuscode").setValue(100000009);  // Revision Requested
        removeOptions(0, primaryControl);
    
        Xrm.Navigation.openAlertDialog('Your revision request has been been submitted');
    }
    
    function removeOptions(executionContext, primaryControl) {
        var formContext = null;
        executionContext == 0 ? formContext = primaryControl : formContext = executionContext.getFormContext();
    
        var statusCode = formContext.getAttribute("statuscode").getText();
        var statusControl = formContext.getControl("header_statuscode");
    
        if (Xrm.Page.ui.getFormType() !== 1 && statusCode.includes('Revision')) {
            statusControl.removeOption(1);
            statusControl.removeOption(100000000);
            statusControl.removeOption(100000001);
            statusControl.removeOption(100000002);
            statusControl.removeOption(100000003);
            statusControl.removeOption(100000003);
            statusControl.removeOption(100000004);
            statusControl.removeOption(100000005);
            statusControl.removeOption(100000006);
            statusControl.removeOption(100000007);
            statusControl.removeOption(100000008);
        }
    }

标签: dynamics-crmmicrosoft-dynamics

解决方案


我相信您想要的是 JavaScript 中removeOptions方法的多态性,一个带有executionContext从表单加载使用的签名,另一个带有primaryControl从功能区使用的签名。这两个签名当然不相同,并且在注册事件处理程序时从表单传递执行上下文只能选择将其作为第一个参数发送。

您所做的是有效的解决方法,可以在两个不同的地方使用可重用方法,并考虑所有限制和平台设计。

阅读此讨论以获得更多理解。


推荐阅读