Typeahead Bloodhound Autocomplete с использованием prefetch + remote, когда источником является dict из Django

Переменная Bloodhound для Typeahead, которая отлично работает:

.
var egDjangoVar = new Bloodhound({
  queryTokenizer: Bloodhound.tokenizers.whitespace,
  datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
  remote: {
    url: '/ajax/eg/%QUERY.json', 
    wildcard: '%QUERY',
    filter: filterdata
  }
});

Мы добавили функцию разбора диктов filter: filterdata, поскольку Django требует, чтобы JSON отправлялся в виде дикта для обеспечения безопасности:

function filterdata(data){
      return $.map(data.results, function(results,index){
        return results.value;
      })
    }

All works beautifully. We now want Prefetch functionality and have added:

prefetch: {
    url: '/ajax/prefetch.json',
    wildcard: '%QUERY',
    filter: filterdata
  },

This doesn't work, despite '/ajax/prefetch.json' serving expected dict. We think it may be due to dataTokenizer issues discussed in this answer, but we don't understand why the tokenizer should differ between remote and prefetch sources, and the suggested datumTokenizer: function(d) { return Bloodhound.tokenizers.whitespace(d.value)}; didn't work when adding it as an argument of prefetch.

We've found that __/ajax/prefetch.json__data in local storage is saved with dict keys matching values like {"datums":{"Apple":"Apple","Banana":"Banana","Orange":"Orange"},"trie":{"i":[],"c":{}}}, whereas the remote data directly viewed is like {"results": [{"value": "Apple"}, {"value": "Banana"}, {"value": "Orange"}]}. Is this unexpected?

Я новичок в области front end / JS, поэтому прошу простить меня, если это глупый вопрос. Что мы делаем не так?

Разобрался: функция filter должна возвращать results вместо results.value.

display:'value' также отсутствовал в инициализации Typeahead (где переменной Bloodhound присваивается значение source).

Вернуться на верх