我遇到了问题:我正在将过滤器传递给我的搜索结果:这样可以正常工作,但是typeahead.js会缓存已经搜索过的查询。
1.键入"黑桃"而我的过滤器被检查。 (7结果)
2.Run查询使用我的过滤器函数从我的数组中删除任何匹配过滤器的结果。 (5场比赛)
3.禁用我的过滤器。
4.运行相同的查询"黑桃",返回2个结果。 (期待7个结果,实际2个结果)
解决此问题的最佳方法是什么?
var card_search = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('CARD_NAME'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
// prefetch: '',
remote: {
url : '/search/queries/%QUERY',
filter: testfilter
}
});
card_search.initialize();
function testfilter(data)
{
$("input:checkbox[name=filtericons]:checked").each(function()
{
var filter = $(this).attr('id');
if(data.length > 0)
{
for (var i = 0; i < data.length; i++) {
var datum;
datum = data[i];
if ((typeof(datum.SUITE) != "undefined") )
{
for(var k=0; k< datum.SUITE.length;k++)
{
if( datum.SUITE[k] == filter)
{
// data[i]['CARD_VIS'] = 'none';
delete data[i];
}
}
}//end if
}
}
});
return data;
}
答案 0 :(得分:1)
在JavaScript中,您通过引用传入数组。
因此,当您执行delete data[i]
时,我相信您正在删除从远程提取中缓存的数据。
在过滤器功能中,请尝试:
function testfilter(remoteData)
{
var data = remoteData.slice();
$("input:checkbox[name=filtericons]:checked").each(function()
{
var filter = $(this).attr('id');
if(data.length > 0)
{
for (var i = 0; i < data.length; i++) {
var datum;
datum = data[i];
if ((typeof(datum.SUITE) != "undefined") )
{
for(var k=0; k< datum.SUITE.length;k++)
{
if( datum.SUITE[k] == filter)
{
// data[i]['CARD_VIS'] = 'none';
delete data[i];
}
}
}//end if
}
}
});
return data;
}