Twitter的输入型猎犬:使用ajax.data和POST时,“%QUERY”相当于什么?

如果使用Bloodhound和GET:

// Typeahead personsBloodhound = new Bloodhound({ datumTokenizer: function (person) { return person.name; }, queryTokenizer: Bloodhound.tokenizers.whitespace, remote: { url: '/ajax/Persons/List?nameContains=%QUERY', ajax: { beforeSend: function(xhr) { $(".searching-person").show(); }, data: { "pageSize": 4, "otherParam1": "blah", "otherParam2": "bleh", } }, filter: function (response) { $(".searching-person").hide(); return response.persons; } } }); 

一个只是在URL中使用%QUERY。

现在….
如果使用Bloodhound和POST,我应该使用什么而不是%QUERY?

 // Typeahead personsBloodhound = new Bloodhound({ datumTokenizer: function (person) { return person.name; }, queryTokenizer: Bloodhound.tokenizers.whitespace, remote: { url: '/ajax/Persons/List', ajax: { type: "POST", beforeSend: function(xhr) { $(".searching-person").show(); }, data: { "nameContains": ....WHAT GOES HERE?????...... "pageSize": 4, "otherParam1": "blah", "otherParam2": "bleh", } }, filter: function (response) { $(".searching-person").hide(); return response.persons; } } }); 

如果不清楚,问题是:
在Bloodhound的遥控器中使用POST时, %QUERY的等效值是多少?

文档不清楚,(certificate): https : //github.com/twitter/typeahead.js/blob/master/doc/bloodhound.md#remote

还尝试使用:

  "nameContains": $("#my-input-that-uses-typeahead").val(), 

但没有奏效。

你必须以某种方式改变URL,否则血腥的人不会发送其他请求(请参阅https://stackoverflow.com/a/24025789/2175370 )并且livesearch / typeahead不会工作。

所以("#my-input-that-uses-typeahead").val()与动态URL结合使用(例如http://127.0.0.1:1234/REST_API/_search?useless=%QUERY )和ajax设置中的beforeSend -function。

我将提出有关此行为的问题。 使用Bloodhound进行POST请求非常尴尬,并且带走了typeahead.js的简单性。

编辑:

还要确保在beforeSend设置数据的新值并设置settings.hasContent = true否则将使用初始数据。

关于如何完成的示例: https : //github.com/twitter/typeahead.js/issues/542#issuecomment-29995960 。

是的,在进一步观察猎犬之后,通配符就是取代而不是价值的东西。

它不会将查询字符串存储在任何位置。 在queryChanged触发并过滤远程响应。 看起来你必须自己得到查询。

 "nameContains": $('input#search').val() 

在Bloodhound的远程中使用POST时,等效%QUERYquery

这是一个简单的示例(详细说明),您可以将其用于GETPOST 。 如您所见,我已声明了一个变量isExtendUrl 。 如果将其设置为true则查询(您键入的内容)将添加到URL的末尾(您必须以某种方式给出myurl )。

下一个变量是isRequestMethod 。 如果将其设置为POST ,则可以使用bloodhound进行POST调用,否则可以将其用于GET调用。 如您所见, prepare函数有两个参数querysettingquery是您键入的内容。 如果您只想在没有GET情况下进行POST调用,请在remote对象内prepare键值对。

因此,如果您必须使用JSON正文作为{gender: 'MALE', name: 'what is typed'}来进行POST调用。 您可以拥有一个包含所有键值对的初始查询对象,例如: initialQuery = {gender: 'MALE'} ,以及在搜索时应添加到initialQuery的关键searchKey ,可以像initialQuery[searchKey] = query一样添加。

最后,如果POST调用的响应对象是一个对象,并且您必须提取特定的键值,请使用filter 。 例如:说出你的回复对象

 { status: 'some status', content: [{array}, {of}, {objects}, ...], someKey: someValue } 

你必须得到content ,然后返回data.content 。 这是一个完整的例子

 let isExtendUrl = true; //to add query at the end of the url, usually used with GET let isRequestMethod = 'POST'; let initialQuery = {gender: 'MALE'}; let searchKey = 'name'; let bloodhound = new Bloodhound({ datumTokenizer: Bloodhound.tokenizers.whitespace, queryTokenizer: Bloodhound.tokenizers.whitespace, remote: { url: isExtendUrl ? myurl + '%QUERY' : myurl, wildcard: '%QUERY', filter: function (data) { return $.map(data.content, function (obj) { return obj; }); } } }); if (isRequestMethod == 'POST') { let prepare = function (query, settings) { initialQuery[searchKey] = query; settings.type = "POST"; settings.contentType = "application/json; charset=UTF-8"; settings.data = JSON.stringify(initialQuery); return settings; } bloodhound.remote.prepare = prepare; }