使用 Typeahead.js + Bloodhound 远程搜索 JSON 对象数组中的多个值
Search multiple values in array of JSON objects using Typeahead.js + Bloodhound remote
我正在尝试使用 Typeahead.js (v0.11.1) + Bloodhound 来显示查询结果。该查询搜索用户列表,并根据 email
、last_name
或 first_name
匹配 returns。如果我查询 smi
匹配项如下所示:
[{"email":"john@email.com","last_name":"Smith","first_name":"John"},
{"email":"bob@email.com","last_name":"Smith","first_name":"Bob"}]
我的 Bloodhound 引擎看起来像这样:
var userSearch = new Bloodhound({
datumTokenizer: function (user) {
return Bloodhound.tokenizers.obj.whitespace(user.email, user.last_name, user.first_name);
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: '/search/users?query=%QUERY',
wildcard: '%QUERY'
}
});
问题是 Typeahead 只在有一个 JSON 对象时显示匹配项,如果是 returns 对象数组,如上例,则没有匹配项。
我尝试将 transform
添加到 remote
,但随后根本没有返回任何匹配项:
transform: function(users) {
return $.map(users, function(user) {
return {
email: user.email,
last_name: user.last_name,
first_name: user.first_name
}
});
}
问题出在 datumTokenizer
,您必须像这样连接标记:
datumTokenizer: function (user) {
var emailTokens = Bloodhound.tokenizers.whitespace(user.email);
var lastNameTokens = Bloodhound.tokenizers.whitespace(user.last_name);
var firstNameTokens = Bloodhound.tokenizers.whitespace(user.first_name);
return emailTokens.concat(lastNameTokens).concat(firstNameTokens);
}
此外,您还需要在 remote
上使用 transform
。但是现在您可以匹配每个 JSON 对象的三个属性中的任何一个。
我正在尝试使用 Typeahead.js (v0.11.1) + Bloodhound 来显示查询结果。该查询搜索用户列表,并根据 email
、last_name
或 first_name
匹配 returns。如果我查询 smi
匹配项如下所示:
[{"email":"john@email.com","last_name":"Smith","first_name":"John"},
{"email":"bob@email.com","last_name":"Smith","first_name":"Bob"}]
我的 Bloodhound 引擎看起来像这样:
var userSearch = new Bloodhound({
datumTokenizer: function (user) {
return Bloodhound.tokenizers.obj.whitespace(user.email, user.last_name, user.first_name);
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: '/search/users?query=%QUERY',
wildcard: '%QUERY'
}
});
问题是 Typeahead 只在有一个 JSON 对象时显示匹配项,如果是 returns 对象数组,如上例,则没有匹配项。
我尝试将 transform
添加到 remote
,但随后根本没有返回任何匹配项:
transform: function(users) {
return $.map(users, function(user) {
return {
email: user.email,
last_name: user.last_name,
first_name: user.first_name
}
});
}
问题出在 datumTokenizer
,您必须像这样连接标记:
datumTokenizer: function (user) {
var emailTokens = Bloodhound.tokenizers.whitespace(user.email);
var lastNameTokens = Bloodhound.tokenizers.whitespace(user.last_name);
var firstNameTokens = Bloodhound.tokenizers.whitespace(user.first_name);
return emailTokens.concat(lastNameTokens).concat(firstNameTokens);
}
此外,您还需要在 remote
上使用 transform
。但是现在您可以匹配每个 JSON 对象的三个属性中的任何一个。