Показать полный список предложений по клику с помощью typeahead и Bloodhound

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

Я нашел этот вопрос о стеке (Twitter TypeAhead показывает все результаты программно), который является так же, как и я, и ответ указывает на то, что jsfiddle решает проблему: http://jsfiddle.net/5xxYq/

Здорово.

Однако похоже, что он работает только тогда, когда в качестве источника для typeahead не используется ищейка.

например Я разветвил их рабочий пример и переключил источник typeahead на использование ищейки: http://jsfiddle.net/5xxYq/31 /. Механизм предложений работает нормально (когда я набираю jo, появляется список), но небольшой хак, чтобы предложения появлялись при нажатии, похоже, больше не работает.

Любая идея о том, как сделать так, чтобы список предложений появлялся при нажатии с помощью Bloodhound?

Спасибо!


person Bruno    schedule 25.11.2014    source источник


Ответы (2)


Если вы используете это решение в сочетании с bloudhound, вам также потребуется изменить файл bloodhound.js или bundle.js.

В typeahead.bundle.js или bloodhound.js добавьте этот код (строка 450)

return matches ? _.map(unique(matches), function(id) {
                return that.datums[id];
            }) : [];

Добавьте эту проверку, чтобы вернуть все предложения, если ввод токена пуст:

if (tokens == '') return that.datums;

Теперь это будет выглядеть так:

if (tokens == '') return that.datums;
return matches ? _.map(unique(matches), function(id) {
                    return that.datums[id];
                }) : [];

Я проверил это в вашей скрипке, и это работает.

person Kuijkens    schedule 26.11.2014
comment
Привет и спасибо :) Я бы предпочел не изменять Bloodhound/bundle.js. Вы говорите, что есть другие решения, вы видели/есть ли у вас такое, которое отвечает на мой вопрос и не модифицирует bundle.js? - person Bruno; 26.11.2014
comment
@ibiza Я думал, что нашел где-то плагин, который сделал это возможным. Но больше не могу найти, извините. я отредактирую свой ответ - person Kuijkens; 26.11.2014
comment
хорошо, спасибо :) Тогда я приму ответ. Если вы найдете изящный способ сделать это, не изменяя bundle.js, дайте мне знать! - person Bruno; 26.11.2014
comment
Решение, которое не изменяет основной пакет в stackoverflow.com/questions/23429918/ - person alttag; 11.06.2015

Я думаю, что может быть лучший способ сделать это. Без изменения js Bloodhound/boundle, но это все еще зависит от внутренней реализации Bloodhound, которая может измениться.

var searchEngine = new Bloodhound({...});
function searchWithDefaults(q, sync) {
  if (q === '') {
    sync(searchEngine.index.all());
  } else {
    searchEngine.search(q, sync);
  }
}
$("#typeahead").typeahead({
  minLength : 0,
}, {
  name : 'typeahead',
  source : searchWithDefaults
});

Этот код использует преимущества внутренней поисковой системы Bloodbound под названием SearchIndex и его функция all(), которая возвращает полный список данных, хранящихся в Bloodhound.

Ответ вдохновлен:

person MJar    schedule 22.12.2015
comment
Обратите внимание, что minLength : 0 является обязательным. Я боролся с этим некоторое время. - person Fl4v; 07.04.2016