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
)。