Фильтр addPreSearch не применяется
Я пытаюсь использовать 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 ответа
Вы правы. 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);
Чтобы обойти задержку асинхронности, я думаю, вам придется реорганизовать свой код:
- Добавьте событие OnLoad формы и выполните запрос для получения
test_field1
и кешировать результаты в параметре - В событии OnChange удалите фильтр предварительного поиска, повторите запрос, чтобы получить
test_field1
и обновить тот же параметр (из onload) - В testFunctionFilter используйте кэшированные результаты, а не создавайте фильтр предварительного поиска с нуля.