当源是来自 Django 的字典时,Typeahead Bloodhound 自动完成使用预取 + 远程

Typeahead Bloodhound Autocomplete using prefetch + remote when source is a dict from Django

Bloodhound variable for 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
  }
});

我们添加了 dict 解析功能 filter: filterdata 因为 Django 要求 JSON 作为安全的 dict 发送:

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

所有作品都很漂亮。我们现在想要 Prefetch functionality 并添加了:

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

这不起作用,尽管 '/ajax/prefetch.json' 提供预期的命令。我们认为这可能是由于 dataTokenizer 问题 discussed in this answer,但我们不明白为什么标记器在远程和预取源之间应该不同,并且建议的 datumTokenizer: function(d) { return Bloodhound.tokenizers.whitespace(d.value)}; 在添加时不起作用它作为 prefetch.

的参数

我们发现本地存储中的__/ajax/prefetch.json__data是用dict键匹配值保存的,如{"datums":{"Apple":"Apple","Banana":"Banana","Orange":"Orange"},"trie":{"i":[],"c":{}}},而直接查看的远程数据如{"results": [{"value": "Apple"}, {"value": "Banana"}, {"value": "Orange"}]}。这是意外吗?

我是前端/JS 的新手,如果这是一个愚蠢的问题,请原谅我。我们做错了什么?

明白了:filter 函数应该 return results 而不是 results.value.

display:'value' 也从 Typeahead 初始化中丢失(其中 Bloodhound 变量被赋予 source)。