Twitter typeahead не показывает результаты, если они начинаются с одного и того же слова

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

    var $termInput = $("#someId");
    var lookup = new Bloodhound({
        datumTokenizer:  Bloodhound.tokenizers.whitespace,
        queryTokenizer: Bloodhound.tokenizers.whitespace,
        remote: {
                url:/search/ + "%QUERY",
                wildcard: '%QUERY'
        }
    });

    lookup.initialize();

    $termInput.typeahead(
        { hint: true, highlight: true },
        {
            source: lookup,
            name: 'cases',
            displayKey: 'id',
            valueKey: 'id',
            templates: {
                empty: "<div class='omniboxresult nomatch'>No matching cases found</div>",
                suggestion: function(data) {
                    console.log(data);


                    return "<div class='omniboxresult'><div class='caseName'>" + "hi " +data.text + "</div></div>";
                }
            }
        }
    );

HTML это:

<input type=text" class="form-control" id="someId" value="" data-provider="typeahead" autocomplete="off">

Используя вкладку сети, я знаю, что мой веб-сервис возвращается (когда я ввожу «Евро»):

[{"id":"1991003933","level":0,"text":"EUROPEAN COMMUNITY"},
{"id":"1971004125","level":0,"text":"EUROPEAN ECONOMIC COMMUNITY"},
{"id":"2011007673","level":0,"text":"EUROPEAN UNION"},
{"id":"2011000582","level":0,"text":"EUROPEAN UNION"}]

Но я получаю только следующее в своем выводе:

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

Если бы я ввел «e», я получил бы больше результатов, например. «Английский», который не подавляется (но я все равно получаю только один результат, начинающийся с «ЕВРОПЕЙСКОГО»

Почему это происходит и как я могу заставить его отображать все полученные результаты?


person Richard Tingle    schedule 31.03.2017    source источник
comment
В конечном итоге это была ошибка в typehead. Обратите внимание, что существует две версии typeahead. Исходный и заброшенный twitter.github.io/typeahead.js и поддерживаемый, который исправление ошибки typeahead.js.org. У первого заброшенного есть этот баг и наверное будет всегда   -  person Richard Tingle    schedule 03.04.2017


Ответы (1)


Я столкнулся с аналогичной проблемой в своем проекте, когда хотел показать предложения автозаполнения для имен. Я хотел показать предложения автозаполнения для имен, а затем для имен и фамилий. Моя реализация в итоге выглядит так:

Sar = Sara, Sarah, Saralou, Sarchenko, Sargent

Sarah[space] = Sarah, Sarah Majercik, Sarah Maddux, Sarah Zarek, Sarah Anderson

Не идеально, так как я бы предпочел, чтобы после того, как кто-то сделал пробел Sarah, он больше не отображался, но я еще не понял этого. Мое решение состояло в том, чтобы добавить в набор данных все уникальные имена и фамилии в алфавитном порядке. Я использовал prefetch, но я думаю, что remote также имеет доступный метод filter:

var lookup = new Bloodhound({
    datumTokenizer:  Bloodhound.tokenizers.whitespace,
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    remote: {
            url:/search/ + "%QUERY",
            filter: function(list) {
                var uniques = [];
                // parse out unique names

                // my list was literally a list of first and last names so I concat them, you'll likely need to do a bit more work here
                return uniqes.concat(list); 
            },
            wildcard: '%QUERY'
    }
});

Используя это, ваши результаты будут выглядеть так:

EURO = EUROPEAN, EUROPEAN COMMUNITY, EUROPEAN ECONOMIC COMMUNITY, EUROPEAN UNION

Надеюсь это поможет.

person benwsmith    schedule 31.03.2017