2015-10-30 2 views
3

Я использую Twitter Typeahead в версии 0.11.1. Теперь я пытаюсь правильно работать с удаленной работой, но почему-то я думаю, что получаю странное поведение.Twitter Typeahead remote не выполняет некоторые запросы

Это рабочий код с локальным массивом:

var localArray = [{"value":"test0"},{"value":"test1"},{"value":"test2"},{"value":"test3"},{"value":"test4"}]; 
var myds = new Bloodhound({ 
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), 
    queryTokenizer: Bloodhound.tokenizers.whitespace, 
    local: localArray 
}); 
$(function() { 
    $("#my-input").typeahead({}, 
    { 
     name: 'ds1', 
     source: myds, 
     display: 'value' 
    }); 
}); 

Теперь я пытаюсь настройки удаленных данных. То, что я сделал, это просто изменить локальный на удаленный и предоставить URL-адрес и добавить параметр запроса. Он будет предоставлять точно такую ​​же структуру и данные, что и localArray (он в настоящее время игнорирует запрос и всегда доставляет содержимое локального массива только для проверки этого). Я проверил в Chrome Developer Tools, что запрос фактически выполняется и возвращает содержимое localArray:

var myds = new Bloodhound({ 
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), 
    queryTokenizer: Bloodhound.tokenizers.whitespace, 
    remote: { 
     url: '/autocomplete?query=%QUERY', 
     wildcard: '%QUERY' 
    }  
}); 
$(function() { 
    $("#my-input").typeahead({}, 
    { 
     name: 'ds1', 
     source: myds, 
     display: 'value' 
    }); 
}); 

Как-то это не работает при поиске test. При поиске tes я все еще получаю результаты, но когда я ищу test, для автозаполнения результатов не найдено. Есть и другие слова, для которых это не работает, и похоже, что они следуют одной и той же схеме, так как полное слово не найдено, когда найдены части слов. Любая идея, что вызывает это поведение или как его исправить?

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

+0

В каком формате находятся ваши удаленные данные? –

+0

Это просто json: '' [{"value": "test0"}, {"value": "test1"}, {"value": "test2"}, {"value": "test3"}, { "value": "test4"}] '' – Tim

+0

Я хочу посмотреть, есть ли у вас известная ошибка с typeahead. Не могли бы вы добавить «limit: 2» в свои настройки typeahead и посмотреть, начнутся ли другие поисковые запросы (конечно, только возврат 2 результатов)? –

ответ

3

Вы испытываете bug в typeahead. Это вызывает странное поведение при работе с наборами результатов, которые равны или меньше предела, объявленного в typeahead (предел по умолчанию равен 5). К сожалению, основное репозиционирование типа «top-back» больше не поддерживается, поэтому вам придется либо использовать PR, который исправляет проблему, либо редактирует код самостоятельно. К счастью, исправление просто перемещается по одной строке кода.

Либо в компилируемый пачке или в src/typeahead/dataset.js найти этот блок кода и изменить его на:

function async(suggestions) { 
    suggestions = suggestions || []; 
    if (!canceled && rendered < that.limit) { 
     that.cancel = $.noop; 
     that._append(query, suggestions.slice(0, that.limit - rendered)); 
     rendered += suggestions.length; 
     that.async && that.trigger("asyncReceived", query); 
    } 
} 

Все это делает движение rendered += suggestions.length;нижеthat._append(query, suggestions.slice(0, that.limit - rendered));;

Это проиллюстрировано в this PR.

Смежные вопросы