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时,等效%QUERY
是query
。
这是一个简单的示例(详细说明),您可以将其用于GET
和POST
。 如您所见,我已声明了一个变量isExtendUrl
。 如果将其设置为true
则查询(您键入的内容)将添加到URL的末尾(您必须以某种方式给出myurl
)。
下一个变量是isRequestMethod
。 如果将其设置为POST
,则可以使用bloodhound进行POST
调用,否则可以将其用于GET
调用。 如您所见, prepare
函数有两个参数query
和setting
。 query
是您键入的内容。 如果您只想在没有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; }