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

#javascript #ajax #xml #string #autofill

#javascript #ajax #xml #строка #автозаполнение

Вопрос:

У меня следующая проблема: когда я выполняю вызов Ajax, чтобы предоставить людям возможность «автозаполнения» поля, он предлагает ту же строку (как видно на изображении ниже). Проблема в том, что вызов Ajax использует URL-адрес, где строка появляется в XML несколько раз.

Например, при вызове

 /tools/_api/web/lists/getbytitle('Besucheranmeldung')/Items?amp;$filter=substringof('Aalen', FirmaNeu)amp;$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="amp;quot;2amp;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="amp;quot;2amp;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="amp;quot;2amp;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="amp;quot;2amp;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.log("startAutoComplete called!");

    NWF$("#"   varTextBoxId).autocomplete({

        source: function (request, response) {

            var query = getQuery(request.term, listname);

            var testurl = "/tools/_api/web/lists/getbytitle('"   listname   "')/Items?amp;$filter="   query;

            console.log("testurl: "   testurl);

            NWF$.ajax({

                url: "/tools/_api/web/lists/getbytitle('"   listname   "')/Items?amp;$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)"   "amp;$select=FirmaNeu";
            break;
    }
    
    // console.log("retvalue: "   retvalue);
    return retvalue;
    
}
 

Как этого можно избежать? Есть ли способ создать оператор if, который проверяет, содержит ли выпадающий список одну и ту же строку дважды, чтобы она не появлялась там несколько раз?

Когда я это делаю console.log(data.d.results); , я получаю следующее:

введите описание изображения здесь

Комментарии:

1. data.d.results Что содержится в журнале, когда вы регистрируетесь?

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

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

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

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

Ответ №1:

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

 var requestHeaders = {
    "Accept": "application/json;odata=verbose",
    "X-RequestDigest": NWF$("#__REQUESTDIGEST").val()
};


function startAutoComplete(varTextBoxId, listname) {
    console.log("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?amp;$filter="   query,
                contentType: "application/json;odata=verbose",
                headers: requestHeaders,

                error: function (xhr, ajaxOptions, thrownError) {
                    alert("error:"   thrownError   "n"   xhr.status);
                },

                success: function (data) {
                    // console.log(data.d.results);
                    var firmaResults;
                    var firmen = [];
                    firmaResults = groupBy(data.d.results,'FirmaNeu');
                    // console.log(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)"   "amp;$select=FirmaNeu";
            break;
    }
    
    // console.log("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 resu<
}