Typeahead Bloodhound POST请求

我似乎无法获得正确使用POST的远程查询。

var creditors = new Bloodhound({ datumTokenizer: function (d) { return Bloodhound.tokenizers.whitespace(d.value) }, queryTokenizer: Bloodhound.tokenizers.whitespace, remote: { url: "../getCreditors", replace: function(url, query) { return url + "#" + query; }, ajax : { type: "POST", data: $.param({q: queryInput.val()}) } } }); 

queryInput.val()只获取对象的当前值,而不是实例化bloodhound对象时的值。 如何将查询字符串放入ajax数据选项中?

你可以使用$ .ajax的beforeSend

 var creditors = new Bloodhound({ datumTokenizer: function (d) { return Bloodhound.tokenizers.whitespace(d.value) }, queryTokenizer: Bloodhound.tokenizers.whitespace, remote: { url: "../getCreditors", replace: function(url, query) { return url + "#" + query; }, ajax : { beforeSend: function(jqXhr, settings){ settings.data = $.param({q: queryInput.val()}) }, type: "POST" } } }); 

您可以将prepare属性与remoteprefetch ,请注意函数签名会更改。 prefetch的示例:

 var Bloodhound = new Bloodhound({ datumTokenizer: Bloodhound.tokenizers.whitespace, queryTokenizer: Bloodhound.tokenizers.whitespace, prefetch: { url: remote, prepare: function (settings) { settings.type = "POST"; settings.contentType = "application/json; charset=UTF-8"; return settings; }, remote: function (query, settings) { settings.type = "POST"; settings.data = {q: query, foo: 'bar'}; // you can pass some data if you need to return settings; } } }); 

请记住,使用remotefunction签名随function(query, settings)

供参考: github.com/twitter/typeahead.js/issues/1236

我发现提到的ajax’beforeSend’方法是最好的。

尽管如此,改变url也很重要。 否则Typeahead没有打扰另一个请求。 所以我只是在url的末尾添加了一个伪造的参数。 像这样

http://mylittleservice.com?blah=%QUERY

这样当打包的ajax数据发生变化时,我确信向服务器发出了新的请求。