Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在typeahead搜索中出现重复记录_Javascript_Jquery_Typeahead.js_Typeahead_Bloodhound - Fatal编程技术网

Javascript 在typeahead搜索中出现重复记录

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">

我正在使用typeahead.js实现typeahead搜索,但作为在typeahead搜索框中的键入,在建议下拉列表中,每个记录会出现两次。我检查了数据源(即api调用后),它只有唯一的记录。我哪里做错了?有帮助或相关链接吗

即使是控制也不会发送到dup检测器

类似的问题,但没有解决方案

  <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您应该发布您的决议并将其标记为答案。如果您得到了答案,则应将其标记为已回答。