6

我正在尝试让 Twitter Typeahead+Bloodhound 与 Google 的 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() 返回的结果作为一个数组。但是,从 中调用 showResults()filter:似乎没有做任何事情,因为删除该行没有任何效果。所以我不太确定发生了什么。

请注意 duffCallback 是我通过阅读这个问题所做的。如果有更好的方法来完成这项工作,我会全力以赴!

4

1 回答 1

7

首先,您使用的 datumTokenizer 不太正确。您需要将其更改为:

datumTokenizer: function(data) {
 return Bloodhound.tokenizers.whitespace(data.value)
}

请注意“空白”函数现在如何引用“数据”输入参数,而不是您使用的“d”。

至于您的问题的解决方案,请参阅此处的工作(例如,尝试搜索“athletics”):

http://jsfiddle.net/Fresh/FYavC/

您的代码的主要问题在于您的远程 URL(这也让我感到困惑!)。有问题的查询字符串参数是:

...&callback=showResults&duffCallback=?

“duffCallback=?” 不需要,因为在 ajax 对象中指定“ datatype:'jsonp' ”会自动添加 jsonp 请求使用的回调详细信息(即“?callback=?”)。此外,“callback=showResults”也不是必需的,因为在发出成功的 jsonp 请求时,Bloodhound 框架会隐式调用过滤器方法。

我同意在使用 Typeahead.js 时应该如何进行远程调用并不明显。指定 ajax 对象的远程调用示例和一些文档在 Typeahead.js 网站上会很有用!

于 2014-05-04T00:39:04.983 回答