Подтвердить что ты не робот

Typeahead, ищейка: удаленные работы, но не предварительная выборка

Я хочу использовать prefetch, и я не могу работать! Вот мой код:

function initAutocompletion() {
    $("input[data-autocomplete-prefetch-url]").each(function () {
        var $this = $(this);
    var urlPrefetch = $this.data("autocomplete-prefetch-url");
    var prefetch;

    pref = {
        url: urlPrefetch,
        filter: filter
    };

    var bloodHound = new Bloodhound({
        datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
        queryTokenizer: Bloodhound.tokenizers.whitespace,
        limit: 10,
        prefetch: pref
    });

    bloodHound.initialize();

    $this
        .typeahead('destroy')
        .typeahead({
            hint: true,
            highlight: true,
            minLength: 1
        },
        {
            displayKey: 'value',
            source: bloodHound.ttAdapter()
        });
    });
 }

function filter(list) {
    return $.map(list, function (v) { return { value: v.toString() }; });
}

Это не работает.

Если я использую remote вместо предварительной выборки, он работает!

    var bloodHound = new Bloodhound({
        datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
        queryTokenizer: Bloodhound.tokenizers.whitespace,
        limit: 10,
        remote: pref
    });

Я не могу согласиться.

Кто-нибудь может мне помочь?

4b9b3361

Ответ 1

Удивительно, но это сработало сегодня утром! Так что это заставило меня подумать, что речь идет о кеше... И это было! Добавление clearPrefetchCache() до инициализации ищейки сделало трюк.

       bloodHound.clearPrefetchCache();
       bloodHound.initialize();

Я думаю, что он не показывал никаких предложений, потому что он кэшировал пустой список.

Ответ 2

Это потому, что typeahead уже загрузил ваши данные из URL предварительной выборки и сохранил его в localStorage. В то время, когда данные находятся в localStorage, предварительная выборка не вызывается.

Попробуйте изменить опцию prefetch cacheKey, как показано ниже, и перезагрузите страницу. Prefetch вызывается, потому что нет данных, привязанных к новому кешу в localStorage.

var engine = new Bloodhound({
  datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
  queryTokenizer: Bloodhound.tokenizers.whitespace,
  prefetch: {
    url: "stations.json",
    cacheKey: "change here!"
  }
});

Вы также можете проверить локальное хранилище с помощью инструментов разработчика Chrome.

enter image description here

Попробуйте удалить локальные данные и перезагрузить страницу. Prefetch вызывается.

Чтобы удалить данные локального хранилища до инициализации Bloodhound, активирует свою предварительную выборку в каждое время инициализации.

localStorage.removeItem("YOUR CACHEKEY");

// Bloodhound initialization with YOUR CACHEKEY.

clearPrefetchCache() до initialize() лучше, я думаю.

Ответ 3

Я столкнулся с вашим вопросом, когда у меня возникли проблемы с работой prefetch, хотя remote работал нормально. Сначала я работал над проблемами кэширования (поскольку это было проблемой раньше), но он все еще не работал.

Далее я реализовал templates в typeahead, чтобы получить информацию о том, что происходит, когда я щелкнул и набрал поле, и ничего не произошло. Появился мой шаблон notFound. Это показалось странным, так как я видел, как префекация попадает на сервер. С выходом отладки на сервере я также мог сказать, что сервер генерирует правильный ответ json.

При проверке json, хотя я заметил, что у него не было пробелов, а моя идола datumTokenizer была настроена как Bloodhound.tokenizers.whitespace. Это заставило меня углубиться в то, как должны работать токенизаторы.

Я нашел это очень полезным: https://github.com/twitter/typeahead.js/blob/master/doc/migration/0.10.0.md#tokenization-methods-must-be-provided

Моя проблема была решена после перехода на:

datumTokenizer: function(d) { return Bloodhound.tokenizers.whitespace(d.value);

(где .value - свойство json, которое я хочу выполнить)

Ответ 4

Возможно, вы пытаетесь предварительно извлечь данные раньше, чем urlPrefetch получает значение. Попробуйте сбросить urlPrefetch на консоль и убедитесь, что он имеет действительный URL.