Выпадающий список с использованием REST API не отображается (отображается в журнале консоли) - PullRequest
0 голосов
/ 18 марта 2020

Я использую API, в котором есть названия упражнений. Я хочу создать окно поиска с выпадающим списком автозаполнения (например, suggetions, которые Google выдает перед тем, как набрать sh, что вы набираете) Но я хочу использовать API в качестве результата.

Мне удалось получить показания из API.

let data;

async function getExercises () {
    let url = 'https://wger.de/api/v2/exercise/?format=json'

    while (url) {
        const res = await fetch(url)
        data = await res.json()

        for (const item of data.results) {
            console.log(item.name)
        }


        url = data.next

    }

    $(document).ready(function() {
        BindControls();
    });

    function BindControls() {

        $('#exercise-search').autocomplete({
            source: data,
            minLength: 0,
            scroll: true
        }).focus(function() {
            $(this).autocomplete("search", "");
        });
    }
}

Я пытаюсь сделать раскрывающийся список, используя результаты API, но не могу заставить его работать.

<input id="exercise-search" class="form-control" type="text" name="data">
        p, div, input {
       font: 16px Calibri;
 }
    .ui-autocomplete {
    cursor:pointer;
    height:120px;
    overflow-y:scroll;
}

это библиотеки, которые я импортировал:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<link href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>

Журнал консоли в моем браузере, похоже, не содержит ошибок.

Любое понимание будет оценено

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Я вижу, что ваш общий результат равен 685, лучше, если мы сможем заполнить эти записи одним выстрелом. но если это невозможно, тогда я просто изменю ваш код соответствующим образом, используя рекурсию.

var sourcearray = []
var getData = function(url) {
    $.getJSON(url, function(d) {
        Array.prototype.push.apply(sourcearray, d.results);
        if (d.next != null) {
            getData(d.next);
        } else {
            console.log(sourcearray)
            var config={
                minLength: 1,
                source: sourcearray,
                focus: function(event, ui) {
                    $("#suggest").val(ui.item.license_author);
                    return false;
                },
                select: function(event, ui) {
                    $("#suggest").val(ui.item.license_author);
                    return false;
                }
            };
            $("#suggest").autocomplete(config).autocomplete("instance")._renderItem = function(ul, item) {
                return $("<li>").append("<div>" + item.license_author + "<br>" + item.description + "</div>").appendTo(ul);
            };
        }
    })
}
$(function() {
    getData("https://wger.de/api/v2/exercise/?format=json")
});

здесь работает fiddle

1 голос
/ 18 марта 2020

Попробуйте что-то вроде этого https://jsfiddle.net/voaf1sLg/.

Все сводится к тому, что вы не сохраняете эти результаты поиска где-либо . Я изменил код для вашей функции asyn c, чтобы он возвращал полный массив со всеми результатами (после всех этих 33 вызовов API, а!), А затем возвращал выполненное обещание с указанными автоматическими записями. Измените свой код соответствующим образом.

async function getEx() {
  let url = 'https://wger.de/api/v2/exercise/?format=json'
  const array = [];

  while (url) {
    const res = await fetch(url)
    data = await res.json()
    for (const item of data.results) {
        console.log(item.name)
        array.push(item.name);
    }
    url = data.next
  }
  return array;
}
$(function() {
  let tags = [];
  getEx().then(res => {
    $( "#tags" ).autocomplete({
    source: res
  });
  });
} );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...