У меня есть следующая проблема: когда я делаю вызов Ajax, чтобы дать людям возможность «автозаполнения» поля, он предлагает ту же строку (как показано на изображении ниже). Проблема в том, что вызов Ajax использует URL-адрес, где строка появляется в XML несколько раз.
Например, при вызове
/tools/_api/web/lists/getbytitle('Besucheranmeldung')/Items?&$filter=substringof('Aalen', FirmaNeu)&$select=FirmaNeu
XML будет выглядеть примерно так:
<?xml version = "1.0" encoding = "utf-8"?><feed xml:base = "https://mylink/tools/_api/" xmlns = "http://www.w3.org/2005/Atom" xmlns:d = "http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss = "http://www.georss.org/georss" xmlns:gml = "http://www.opengis.net/gml"><id>fbe3c761-2113-4be6-b8dd-599cf842df2f</id><title /><updated>2020-12-16T12:58:45Z</updated><entry m:etag = ""2""><id>Web/Lists(guid'5d3a8bf8-7edf-4b7e-aab8-5df6cd818573')/Items(10891)</id><category term = "SP.Data.BesucheranmeldungListItem" scheme = "http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /><link rel = "edit" href = "Web/Lists(guid'5d3a8bf8-7edf-4b7e-aab8-5df6cd818573')/Items(10891)" /><title /><updated>2020-12-16T12:58:45Z</updated><author><name /></author><content type = "application/xml"><m:properties><d:FirmaNeu>IGM Aalen</d:FirmaNeu></m:properties></content></entry><entry m:etag = ""2""><id>Web/Lists(guid'5d3a8bf8-7edf-4b7e-aab8-5df6cd818573')/Items(10893)</id><category term = "SP.Data.BesucheranmeldungListItem" scheme = "http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /><link rel = "edit" href = "Web/Lists(guid'5d3a8bf8-7edf-4b7e-aab8-5df6cd818573')/Items(10893)" /><title /><updated>2020-12-16T12:58:45Z</updated><author><name /></author><content type = "application/xml"><m:properties><d:FirmaNeu>'IGM Aalen</d:FirmaNeu></m:properties></content></entry><entry m:etag = ""2""><id>Web/Lists(guid'5d3a8bf8-7edf-4b7e-aab8-5df6cd818573')/Items(10894)</id><category term = "SP.Data.BesucheranmeldungListItem" scheme = "http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /><link rel = "edit" href = "Web/Lists(guid'5d3a8bf8-7edf-4b7e-aab8-5df6cd818573')/Items(10894)" /><title /><updated>2020-12-16T12:58:45Z</updated><author><name /></author><content type = "application/xml"><m:properties><d:FirmaNeu>IGM Aalen</d:FirmaNeu></m:properties></content></entry><entry m:etag = ""2""><id>Web/Lists(guid'5d3a8bf8-7edf-4b7e-aab8-5df6cd818573')/Items(10895)</id><category term = "SP.Data.BesucheranmeldungListItem"
Я использую следующий код, чтобы получить раскрывающийся список:
var requestHeaders = {
"Accept": "application/json;odata=verbose",
"X-RequestDigest": NWF$("#__REQUESTDIGEST").val()
};
function startAutoComplete(varTextBoxId, listname) {
console.info("startAutoComplete called!");
NWF$("#" + varTextBoxId).autocomplete({
source: function (request, response) {
var query = getQuery(request.term, listname);
var testurl = "/tools/_api/web/lists/getbytitle('" + listname + "')/Items?&$filter = " + query;
console.info("testurl: " + testurl);
NWF$.ajax({
url: "/tools/_api/web/lists/getbytitle('" + listname + "')/Items?&$filter = " + query,
contentType: "application/json;odata=verbose",
headers: requestHeaders,
error: function (xhr, ajaxOptions, thrownError) {
alert("error:" + thrownError + "\n" + xhr.status);
},
success: function (data) {
response(NWF$.map(data.d.results, function (item) {
switch (listname) {
case "Besucheranmeldung":
return {
label: item.FirmaNeu,
value: item.FirmaNeu,
id: item.FirmaNeu,
listname: listname
}
break;
}
}));
}
});
},
minLength: 2,
select: function (event, ui) {
},
open: function () {
NWF$(this).removeClass("ui-corner-all").addClass("ui-corner-top");
},
close: function () {
NWF$(this).removeClass("ui-corner-top").addClass("ui-corner-all");
}
});
}
function getQuery(requestStr, listname) {
var retvalue = "";
requestStr = encodeURIComponent(requestStr);
switch (listname) {
case "Besucheranmeldung":
retvalue = "substringof('" + requestStr + "', FirmaNeu)" + "&$select=FirmaNeu";
break;
}
// console.info("retvalue: " + retvalue);
return retvalue;
}
Как этого избежать? Есть ли способ сделать оператор if, который проверяет, содержит ли раскрывающийся список одну и ту же строку дважды, чтобы она не появлялась там несколько раз?
Когда я делаю console.info(data.d.results);, я получаю следующее:
Вероятно, кеширование браузера вызывает вашу проблему. Попробуйте добавить к URL-адресу фиктивное значение для очистки кеша, например "&dt = " + new Date().valueOf(). Это позволит каждому запросу иметь уникальную отметку времени и предотвратит возврат кэшированного результата.
@Tomalak Я отредактировал сообщение.
@WilliamWalseth Я попробовал это, но это ничего не изменило, извините.
Пожалуйста, не публикуйте скриншоты текста или кода, если вы можете опубликовать фактический код. Скриншоты бесполезны. Но очевидно, что дублирование уже есть в данных. Проверьте сам список источников или способ его запроса.
@Tomalak Как вы ожидаете, что люди будут публиковать здесь «data.d.results» консоли? В любом случае, я нашел ответ здесь: sharepoint.stackexchange.com/questions/95594/… Тем не менее спасибо за помощь
Одним из способов было бы закодировать его как JSON и опубликовать здесь в виде обычного текста. Дело в том, что скриншоты кода никому не нужны. Они не доступны для поиска, и вы не можете скопировать их для разработки или проверки возможного ответа. Избегайте скриншотов всего, что не относится строго к графике.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Исправил, изменив код:
var requestHeaders = {
"Accept": "application/json;odata=verbose",
"X-RequestDigest": NWF$("#__REQUESTDIGEST").val()
};
function startAutoComplete(varTextBoxId, listname) {
console.info("startAutoComplete called!");
NWF$("#" + varTextBoxId).autocomplete({
source: function (request, response) {
var query = getQuery(request.term, listname);
NWF$.ajax({
url: "/tools/_api/web/lists/getbytitle('" + listname + "')/Items?&$filter = " + query,
contentType: "application/json;odata=verbose",
headers: requestHeaders,
error: function (xhr, ajaxOptions, thrownError) {
alert("error:" + thrownError + "\n" + xhr.status);
},
success: function (data) {
// console.info(data.d.results);
var firmaResults;
var firmen = [];
firmaResults = groupBy(data.d.results,'FirmaNeu');
// console.info(firmaResults);
for (var i = 0; i < firmaResults.length; i++ ){
firmen[i] = firmaResults[i];
}
var counter = -1;
response(NWF$.map(data.d.results, function (item) {
switch (listname) {
case "Besucheranmeldung":
counter++;
if (counter > firmaResults.length){
return;
}
return {
label: firmen[counter],
value: firmen[counter],
id: firmen[counter],
listname: listname
}
break;
}
}));
}
});
},
minLength: 2,
select: function (event, ui) {
},
open: function () {
NWF$(this).removeClass("ui-corner-all").addClass("ui-corner-top");
},
close: function () {
NWF$(this).removeClass("ui-corner-top").addClass("ui-corner-all");
}
});
}
function getQuery(requestStr, listname) {
var retvalue = "";
requestStr = encodeURIComponent(requestStr);
switch (listname) {
case "Besucheranmeldung":
retvalue = "substringof('" + requestStr + "', FirmaNeu)" + "&$select=FirmaNeu";
break;
}
// console.info("retvalue: " + retvalue);
return retvalue;
}
function groupBy(items,propertyName)
{
var result = [];
$.each(items, function(index, item) {
if ($.inArray(item[propertyName], result) == -1) {
result.push(item[propertyName]);
}
});
return result;
}
Когда вы регистрируетесь
data.d.results, что он содержит?