addPreSearch 过滤器不适用
addPreSearch filter not applying
我正在尝试使用 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
调用是否以某种方式导致了问题?我不太确定哪里出了问题。请指教
你是对的。 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 中使用缓存的结果而不是从头开始构建预搜索过滤器
我正在尝试使用 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
调用是否以某种方式导致了问题?我不太确定哪里出了问题。请指教
你是对的。 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 中使用缓存的结果而不是从头开始构建预搜索过滤器