【问题标题】:addPreSearch filter not applyingaddPreSearch 过滤器不适用
【发布时间】:2019-05-29 08:58:49
【问题描述】:

我正在尝试使用addPreSearch 函数将自定义过滤器添加到查找字段,但在显示查找结果之前该函数似乎没有完全执行。代码如下所示:

function onFieldChange(executionContext) {
    var formContext = executionContext.getFormContext();
    formContext.getControl("test_code").removePreSearch(testFunctionFilter);
    formContext.getControl("test_code").addPreSearch(testFunctionFilter);
}


function testFunctionFilter(executionContext) {
    var formContext = executionContext.getFormContext();

    var record1 = formContext.getAttribute("test_record1_link").getValue(); //get linked record
    var record1FullId, record1Id, stringRecordId, idLength, record1Guid = "0";
    if (record1 != null)  {
        record1Id = record1[0].id;
        record1Id = record1FullId.slice(1, -1);
        stringRecordId = record1FullId.toString();
        idLength = stringRecordId.length;


        //Guid when retrieved from tablet does not have parenthesis on each end
        if (idLength == 36) {
            record1Guid = record1FullId;
        } else {
            record1Guid = recordId;
        }
    }

    var fieldValue;
    Xrm.WebApi.retrieveRecord("test_record1", record1Guid, "?$select=test_field1")
        .then(function(result1) {
            fieldValue = result1.test_field;
            var options = generateOptions(executionContext, fieldValue); //creates option string using retrieved fieldValue
            Xrm.WebApi.retrieveMultipleRecords("test_record2", options)
                .then(function(result) {
                    var codes = getCodes(result2, fieldValue);
                    filter = generateFilter(codes, record1Guid); //creates custom filter using provided parameters
                    console.log(filter); //displays filter correctly
                    formContext.getControl("test_codelookup").addCustomFilter(filter, "test_coderecord"); //not working?
            });
        });
}

过滤器是使用上面未显示定义的函数正确生成的。那不是问题。我尝试创建一个单独的测试函数,在其中硬编码上述函数生成的过滤器之一,并且查找显示了正确的结果。 testFunctionFilter 应该在显示查找结果之前运行完成,对吗?因为在查找结果出现后过滤器被记录到控制台。嵌套的异步 Xrm.WebApi 调用是否以某种方式导致了问题?我不太确定出了什么问题。请指教。

【问题讨论】:

    标签: javascript dynamics-crm microsoft-dynamics dynamics-crm-webapi dynamics-crm-365-v9


    【解决方案1】:

    为了解决异步延迟,我认为您将不得不重新组织您的代码:

    1. 添加表单OnLoad事件并执行查询以检索test_field1并将结果缓存在参数中
    2. OnChange 事件中,移除预搜索过滤器,重新执行查询以检索 test_field1 并更新相同的参数(来自 onload
    3. testFunctionFilter 中使用缓存的结果,而不是从头开始构建预搜索过滤器

    【讨论】:

      【解决方案2】:

      你是对的。 Xrm.WebApi 调用始终是异步,在使用addCustomFilter 添加动态过滤器的情况下,这是不可用的。

      您必须使用XMLHttpRequest 并通过将第三个参数设置为false 来将该调用设为同步,如下所示:

      var req = new XMLHttpRequest();
      req.open("GET", Xrm.Utility.getGlobalContext().getClientUrl() + 
                                "/api/data/v9.0/test_record1?$select=test_field1", false);
      

      【讨论】:

      • 同步 XMLHttpRequests 不被弃用吗?出于这个原因,我试图避免使用这种方法。
      • @deviant_innovator XMLHttpRequest 是浏览器原生的,它是当今进行同步调用的唯一方法(第三方库除外)
      猜你喜欢
      • 1970-01-01
      • 2014-03-11
      • 2021-07-07
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多