Вызов Javascript Ajax несколько раз возвращает одну и ту же строку из XML. Как этого избежать?

У меня есть следующая проблема: когда я делаю вызов 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 = "&quot;2&quot;"><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 = "&quot;2&quot;"><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 = "&quot;2&quot;"><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 = "&quot;2&quot;"><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);, я получаю следующее:

Когда вы регистрируетесь data.d.results, что он содержит?

Tomalak 16.12.2020 15:28

Вероятно, кеширование браузера вызывает вашу проблему. Попробуйте добавить к URL-адресу фиктивное значение для очистки кеша, например "&dt = " + new Date().valueOf(). Это позволит каждому запросу иметь уникальную отметку времени и предотвратит возврат кэшированного результата.

William Walseth 16.12.2020 16:50

@Tomalak Я отредактировал сообщение.

stepbysteptomathpro 16.12.2020 20:42

@WilliamWalseth Я попробовал это, но это ничего не изменило, извините.

stepbysteptomathpro 16.12.2020 20:42

Пожалуйста, не публикуйте скриншоты текста или кода, если вы можете опубликовать фактический код. Скриншоты бесполезны. Но очевидно, что дублирование уже есть в данных. Проверьте сам список источников или способ его запроса.

Tomalak 16.12.2020 21:16

@Tomalak Как вы ожидаете, что люди будут публиковать здесь «data.d.results» консоли? В любом случае, я нашел ответ здесь: sharepoint.stackexchange.com/questions/95594/… Тем не менее спасибо за помощь

stepbysteptomathpro 16.12.2020 21:17

Одним из способов было бы закодировать его как JSON и опубликовать здесь в виде обычного текста. Дело в том, что скриншоты кода никому не нужны. Они не доступны для поиска, и вы не можете скопировать их для разработки или проверки возможного ответа. Избегайте скриншотов всего, что не относится строго к графике.

Tomalak 16.12.2020 21:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Исправил, изменив код:

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;
}

Другие вопросы по теме