输入Bloodhound自动补全,使用prefetch + remote当源是来自Django的字典时



Typeahead的Bloodhound变量:

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: {
url: '/ajax/prefetch.json',
wildcard: '%QUERY',
filter: filterdata
},

这不起作用,尽管'/ajax/prefetch.json'提供预期的字典。我们认为这可能是由于这个答案中讨论的dataTokenizer问题,但我们不明白为什么标记器在远程和预取源之间应该不同,并且建议的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函数应该返回results而不是results.value

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

最新更新