我用Twitter的Typeahead插件将头发拉了几个小时。
基本上,我们从响应格式为.JSON的Web服务(Asmx webservice)中提取数据。
一旦我们通过BloodHound获取它,我们然后将其转换为字符串,删除一些其他字符,然后将其重新转换为Json,然后将其传递给Typeahead。
var engine= new Bloodhound({
datumTokenizer: function (d) {
return Bloodhound.tokenizers.whitespace("value")
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
prefetch : {
ttl : 1000,
url : '/webservice.asmx'
},
remote: {
ttl : 1000,
url: '/webservice.asmx',
ajax: {
beforeSend: function (jqXhr, settings) {
jqXhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
settings.data = '{"query":"' + $('#inputText').val() + '"}';
alert(settings.data);
},
type: "POST",
context: this
},
filter: function (response) {
//return response;
if (response.hasOwnProperty('d')) {
var returned = String(response.d);
returned = returned.slice(14,-1);
var parsedJSON = jQuery.parseJSON(returned);
return parsedJSON ;
}
else {
return response;
}
}
}
});
engine.initialize();
$('#inputText').typeahead(null, {
source: engine.ttAdapter()
});
在输入字段中键入时,代码通过Ajax ONCE和ONCE ONLY基于查询获取数据,但是当用户在输入框中键入更多字符时,它会多次通过过滤器。我相信这是问题所在。因为使用Asmx webservice的方法我们必须使用一种POST,所以无论我们在输入框中键入多少个字符,Ajax似乎都不能生成多个请求。
正如我所说,这让我们疯狂了几天,所以任何帮助都会令人难以置信。
答案 0 :(得分:0)
此博客帮助解决了问题 - http://www.weezey.com/2014/03/bringing-it-all-together/
看起来我们过分复杂了一些事情。我们仍然不得不剥离并重新转换我们的Web服务器在Ajax部分中回放的Json,但我们让它工作了。