3

I'm using typeahead (0.10.1) in an app to return a list of clients using bloodhound prefetch. I can't work out how to update/reinitialise bloodhound with a new thumbprint so that after the new client is inserted it will use a new thumbprint and hence include the new client.

The system is ajax so I can't just change the name on refresh, I'm trying to pass it another thumbprint as per below in the reinitializeclient() but it's not working:

var clientthumbprint = "initialname";
var clients = new Bloodhound({ 
    limit: 5,
    prefetch:{
    url: '/urltofeed/',
    thumbprint:getthumbprint()
   },
  datumTokenizer: function(d) { 
  return Bloodhound.tokenizers.whitespace(d.label); 
},
  queryTokenizer: Bloodhound.tokenizers.whitespace
});
clients.initialize();

function reinitializeclient(newthumbprint){
  //This is called when a client is saved
  clientthumbprint = newthumprint;
  clients.initialize(); //this didn't work
}  

function getthumbprint(){
  return clientthumbprint;
}

$('#search_user').typeahead({
    minLength: 2,
  },
  {
   displayKey: 'label',
   source: clients.ttAdapter()
})

Anyone have any ideas what I'm doing wrong?

EDIT: After updating my typeahead files using the pull request mentioned by @jharding, I can get it to reset, but not reinitialise.Using the following:

function initialize_clients(){
  clients = new Bloodhound({ 
    limit: 5,
    prefetch:{
      url: '/pathtojson/',
      thumbprint:getthumbprint()
    },
    datumTokenizer: function(d) { 
      return Bloodhound.tokenizers.whitespace(d.label); 
    },
    queryTokenizer: Bloodhound.tokenizers.whitespace
  });
  clients.initialize();
};  

function resetclients(){    
  clientthumbprint = 'somenewthumbprint';
  clients.reset();//this works - after running nothing will return in search
  initialize_clients();//this is not working
}  

function getthumbprint(){
   return clientthumbprint;
}
4

3 回答 3

8

You probably had an answer to this already but i thought i would add the code that worked for me

//This seems to refresh my prefetch data
clients.clearPrefetchCache();

//not sure whether setting to true does anything 
//though, but according to the bloodhound.js it should force a reinitialise
clients.initialize(true);

Hope it helps

于 2014-07-30T14:52:40.787 回答
1

In my case, I got my results from url as JSON data using prefetch, and wanted to clear only prefetch data (as I need to clear it after adding some other data)

clients.initialize(true); method worked for me

于 2017-08-16T22:12:36.227 回答
1

this always works for me to clear local/prefetched/remote data and reload it:

clients.clear();
clients.clearPrefetchCache();
clients.clearRemoteCache();
clients.initialize(true);
于 2018-10-05T21:04:58.820 回答