Фильтр addPreSearch не применяется - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь использовать функцию 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 вызовы каким-то образом причиной проблемы?Я не совсем уверен, что не так.Пожалуйста, сообщите.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Чтобы обойти асинхронную задержку, я думаю, вам придется реорганизовать свой код:

  1. Добавить событие формы OnLoad и выполнить запрос кполучить test_field1 и кэшировать результаты в параметре
  2. . В событии OnChange удалите фильтр предварительного поиска, повторно выполните запрос для получения test_field1 и обновите тот же параметр (из onload )
  3. В testFunctionFilter использовать кэшированные результаты, а не создавать предварительный фильтр с нуля
0 голосов
/ 02 января 2019

Вы правы. 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...