【问题标题】:EnableRule in ribbon cannot get boolean value from async function功能区中的 EnableRule 无法从异步函数获取布尔值
【发布时间】:2021-12-08 02:58:37
【问题描述】:

我想从函数showHideAddNewButton 中返回truefalse。我在功能区按钮中有一个EnableRule,它调用了一个自定义规则,该规则调用了这个函数showHideAddNewButton。传递true(将显示按钮)或false(将隐藏按钮)时。

我必须访问实体上的statuscode(状态原因)和statecode(状态)字段。我使用Xrm.WebApi.retrieveMultipleRecords 创建了一个查询,但无法让它返回一个标志。我希望 retrieveMultipleRecords 方法只执行并且永远不会再次被调用,但下面的“返回 true”会被执行,将我的按钮设置为 true。

function showHideAddNewCsrsRecalculation(primaryControl){
    var fileNumber = primaryControl.getAttribute("ssg_filenumber").getValue();
    
        Xrm.WebApi.retrieveMultipleRecords("rrg_csrsfile", "?$select=statuscode,statecode,rr_filenumber&$filter=rr_filenumber eq '" + fileNumber + "'").then(
            function success(result) {
                for (var i = 0; i < result.entities.length; i++) {
                    var statusCode = result.entities[i].statecode; 
                    var statusReasonCode = result.entities[i].statuscode; 
                    
                    //if draft make button invisible
                    if (statusReasonCode == 8676725)
                       return false;
                    //if submitted make button invisible
                     if (statusReasonCode == 8676726)
                       return false; 
    
                    //if inactive make button invisible
                     if (statusCode == 1)
                       return false;
                }           
            },
            function (error) {
                console.log(error.message);
                // handle error conditions
            }
        );
        
    //if draft make button invisible
    //if (primaryControl.getAttribute("statuscode").getValue() == 867670025)
    //   return false; 
    //if submitted make button invisible
    //if (primaryControl.getAttribute("statuscode").getValue() == 867670026)
    //  return false; 
    
    //if inactive make button invisible
    //if (primaryControl.getAttribute("statecode") != 'undefined' && primaryControl.getAttribute("statecode").getValue() == 1)
    //  return false;
    
    //other options make button visible
      return true; --> This keeps getting called as a result my button is always visible
}

【问题讨论】:

    标签: javascript dynamics-crm es6-promise dynamics-365 dynamics-crm-365


    【解决方案1】:

    函数Xrm.WebApi.retrieveMultipleRecords 返回一个promise,而不是一个实际的布尔值。该函数是异步执行的,因此在调用该函数后会立即执行下一行,并且该行总是返回true

    实际上不可能使异步调用同步。相反,我们可以按照以下步骤采用另一种方法:

    1. 在表单的 onload 函数中执行查询并将结果存储在变量中。
    2. 刷新功能区。
    3. 创建返回变量值的功能区按钮处理程序。
    let isRecalculationButtonVisible = false;
    
    function onLoad(context) {
        const formContext = context.getFormContext();
    
        const filter = "$filter=rr_filenumber eq '"
            + formContext.getAttribute("ssg_filenumber").getValue()
            + "' and (statecode eq 1 or statuscode eq 8676725 or statuscode eq 8676726)";
    
        Xrm.WebApi.retrieveMultipleRecords("rrg_csrsfile", "?$select=rrg_csrsfileid&$top=1&" + filter)
            .then(function (result) {
                isRecalculationButtonVisible = result.entities.length === 0;
            })
            .catch(function (error) {
                console.log(error.message);
            })
            .finally(() => {
                formContext.ui.refreshRibbon(false);
            });
    }
    
    function showHideAddNewCsrsRecalculation() {
        return isRecalculationButtonVisible;
    }
    

    您可能已经注意到,我添加了一些改进。

    1. 您的按钮只需要知道如果有任何记录满足特定条件,因此无需实际检索它们。因此,这些条件可以简单地放在查询的过滤器中。我还加了一个$top=1,因为满足条件的记录数在这里不相关。因此,唯一需要检查的是记录是否被返回。
    2. 如前所述,retrieveMultipleRecords 返回一个承诺。推荐的 promise 错误处理是在链的末尾添加一个 catch 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 2021-11-24
      • 2012-02-03
      • 2019-07-29
      • 2019-12-29
      • 2018-04-09
      • 2021-11-02
      相关资源
      最近更新 更多