我正试图让Twitter Typeahead+Bloodhound与谷歌的CSE合作。
到目前为止,我已经设法返回了结果,但我无法计算出datumTokenizer。
var results = new Bloodhound({
datumTokenizer: function(data) {
return Bloodhound.tokenizers.whitespace(d.value)
},
queryTokenizer: Bloodhound.tokenizers.obj.whitespace,
remote: {
url: "http://clients1.google.com/complete/search?client=partner&hl=en&sugexp=gsnos%2Cn%3D13&gs_rn=25&gs_ri=partner&partnerid=004914516364918182382%3Ayfqw09r4qvu&types=t&ds=cse&cp=3&gs_id=15&q=%QUERY&callback=showResults&duffCallback=?",
ajax: $.ajax({type:'GET',dataType:'jsonp',jsonp:'duffCallback'}),
filter: showResults
}
});
看小提琴:http://jsfiddle.net/thugsb/3KAjh/
您会看到,我得到了showResults((作为数组返回的结果。然而,从filter:
调用showResults((似乎没有任何作用,因为删除该行没有任何效果。所以我不太确定发生了什么。
请注意,duffCallback是我读到这个问题后想做的。如果有更好的方法让这件事成功的话,我洗耳恭听!
首先,您使用的datumTokenizer不太正确。您需要将其更改为:
datumTokenizer: function(data) {
return Bloodhound.tokenizers.whitespace(data.value)
}
请注意,"空白"函数现在引用的是"data"输入参数,而不是您使用的"d"。
至于你的问题的解决方案,请参阅这里的工作(例如,尝试搜索"田径"(:
http://jsfiddle.net/Fresh/FYavC/
你的代码的主要问题是在你的远程URL中(这也让我感到困惑!(。有问题的查询字符串参数为:
...&callback=showResults&duffCallback=?
"dufCallback=?"不是必需的,因为在ajax对象中指定"datatype:'jsonp'"会自动添加jsonp请求使用的回调详细信息(即"?callback=??"(。此外,不需要"callback=showResults",因为当成功发出jsonp请求时,Bloodhound框架会隐式调用过滤器方法。
我同意,在使用Typeahead.js时,远程调用应该如何进行并不明显。在Typeahead js网站上,指定ajax对象的远程调用示例和一些文档会很有用!