简体   繁体   中英

filtering search results typeahead.js

i'm having a problem: I am passing a filter to my search results: This works fine, however typeahead.js caches already searched queries.

1.Type in "spades" while my filter is checked. (7 results)

2.Runs query using my filter function to delete from my array any results that match filter. (5 matches)

3.Disable my filter.

4.Run the same query "spades", 2 results returned. (expect 7 results, actual 2 results)

what's the best way to solve this problem?

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();

filter function:

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;
}

In JavaScript, you are passing in the array by reference.

So when you do delete data[i] I believe you are deleting the data cached from the remote fetch.

In your filter function, try:

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;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM