Javascript 在typeahead搜索中出现重复记录
我正在使用typeahead.js实现typeahead搜索,但作为在typeahead搜索框中的键入,在建议下拉列表中,每个记录会出现两次。我检查了数据源(即api调用后),它只有唯一的记录。我哪里做错了?有帮助或相关链接吗 即使是控制也不会发送到dup检测器 类似的问题,但没有解决方案Javascript 在typeahead搜索中出现重复记录,javascript,jquery,typeahead.js,typeahead,bloodhound,Javascript,Jquery,Typeahead.js,Typeahead,Bloodhound,我正在使用typeahead.js实现typeahead搜索,但作为在typeahead搜索框中的键入,在建议下拉列表中,每个记录会出现两次。我检查了数据源(即api调用后),它只有唯一的记录。我哪里做错了?有帮助或相关链接吗 即使是控制也不会发送到dup检测器 类似的问题,但没有解决方案 <div id="bloodhound"> <input class="typeahead" type="text" placeholder=" Search">
<div id="bloodhound">
<input class="typeahead" type="text" placeholder=" Search">
</div>
<script>
var result = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: 'https://api1.com/idocs/api',
wildcard: '%QUERY',
rateLimitWait: 300 ,
transport: function (opts, onSuccess, onError) {
var url = opts.url;
$.ajax({
url: url,
type: "POST",
success: onSuccess,
error: onError,
});
},
filter: function (data) {
if (data) {
return $.map(data, function (object) {
return data.data.results.data;
});
}
}
},
dupDetector: function (remoteMatch, localMatch) {
return remoteMatch.id === localMatch.id;
}
});
result.initialize();
$('input').typeahead(null, {
name: 'result',
displayKey: 'id',
source: result.ttAdapter(),
templates: {
empty: ['<div>', 'no results found', '</div>'],
suggestion: function (data) {
return '<p>' + data.basicinfo.object_name + '</p>';
}
},
});
var结果=新猎犬({
datumTokenizer:Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer:猎犬,标记,空白,
远程:{
网址:'https://api1.com/idocs/api',
通配符:“%QUERY”,
等一下:300,
传输:功能(选项、成功、错误){
var url=opts.url;
$.ajax({
url:url,
类型:“POST”,
成功:一旦成功,
错误:onError,
});
},
过滤器:功能(数据){
如果(数据){
返回$.map(数据、函数(对象){
返回data.data.results.data;
});
}
}
},
dupDetector:函数(remoteMatch、localMatch){
返回remoteMatch.id==localMatch.id;
}
});
result.initialize();
$(“输入”).typeahead(空{
名称:“结果”,
displayKey:'id',
来源:result.ttAdapter(),
模板:{
空:[''‘未找到结果',''],
建议:功能(数据){
返回“”+data.basicinfo.object_name+””;
}
},
});
我找到了解决方案,我在过滤器中做错了。我的解决办法是
var result = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: 'abc.com&qterm=#%QUERY',
wildcard: '%QUERY',
rateLimitWait: 300 ,
transport: function (opts, onSuccess, onError) {
var url = opts.url.split("#")[0];
var query = opts.url.split("#")[1];
$.ajax({
url: url + query,
type: "POST",
success: onSuccess,
error: onError,
});
},
filter: function (data) {
if (data) {
var result = data.data.results.data;
return $.map(result, function (object) {
return { name: object.basicinfo.object_name, id: object.basicinfo.id };
});
} else {
return {};
}
}
},
dupDetector: function (remoteMatch, localMatch) {
return remoteMatch.id === localMatch.id;
}
});
function onSuccess(data) {
}
result.initialize();
$('input').typeahead(null, {
hint: true,
name: 'result',
displayKey: 'name',
source: result.ttAdapter(),
templates: {
empty: ['<div class="empty-message">', 'no results found', '</div>'].join('\n'),
suggestion: function (data) {
return '<p class="type-suggestion">' + data.name + '</p> \n\r';
}
},
})
var result=新猎犬({
datumTokenizer:Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer:猎犬,标记,空白,
远程:{
url:'abc.com&qterm=#%QUERY',
通配符:“%QUERY”,
等一下:300,
传输:功能(选项、成功、错误){
var url=opts.url.split(“#”)[0];
var query=opts.url.split(“#”)[1];
$.ajax({
url:url+查询,
类型:“POST”,
成功:一旦成功,
错误:onError,
});
},
过滤器:功能(数据){
如果(数据){
var结果=data.data.results.data;
返回$.map(结果、函数(对象){
返回{name:object.basicinfo.object\u name,id:object.basicinfo.id};
});
}否则{
返回{};
}
}
},
dupDetector:函数(remoteMatch、localMatch){
返回remoteMatch.id==localMatch.id;
}
});
函数onSuccess(数据){
}
result.initialize();
$(“输入”).typeahead(空{
提示:没错,
名称:“结果”,
displayKey:'名称',
来源:result.ttAdapter(),
模板:{
空:['',未找到任何结果',''。联接('\n'),
建议:功能(数据){
返回“”+data.name+”
\n\r';
}
},
})
您可以创建一个jsbin或JSFIDLE来重现错误吗?如果不是这样的话,你能重构你的代码来删除任何不必要的东西(模板、提示、绑定等等),看看发生了什么吗?要查看筛选函数中的Console.log,请将Console.log放入筛选函数-filter:function(data){Console.log(data);if(data){return$.map(data,function(object){Console.log(object);Console.log(data.data);Console.log(data.data.results);Console.log(data.data.results.data);return data.data.results.data;});}}}我认为过滤器函数没有任何意义。您应该在map函数中处理对象,但对于“data”忽略它相反,@F11您应该发布您的决议并将其标记为答案。如果您得到了答案,则应将其标记为已回答。