2013-08-08 2 views
3

J'ai réussi à créer un appel Twitter typeahead ajax travail.Twitter-bootstrap typeahead dulicates

Je rencontre un problème lorsque des éléments sont dupliqués lors d'une saisie trop rapide.

Exemple de scénario:

en essayant d'obtenir « Casablanca » vous seriez commencez à taper, et attendre que le temps que vous atteignez « casa » il sera relativement bien filtré. Malheureusement, les articles sont en double, de sorte qu'au lieu d'avoir 2 ou 3 options, je vais avoir entre 9 et 20 D:

Voici la JS qui fait l'appel:

$(".airportSearch").typeahead({ 
    source: function(query, process) { 
     airports = []; 
     map = {}; 

     $.ajax({ 
      url: url_, 
      dataType: "json", 
      data: { 
       n: 12, q: query 
      }, 
      success: function(data) { 
        $.each(data, function (i, record) { 
        map[record.airport] = record; 
        airports.push(record.city + ", " + record.airport + " (" + record.iata + "), " + record.country); 
       }); 

       process(airports); 
      } 
     }); 
    }, 
    minLength: 1, 
    items: 11, 
    sorter: function (items) { 
     return items.sort(); 
    }, 
    updater: function (item) { 
     selectedState = map[item].iata; 
     return item; 
    } 
}); 

Il fonctionne parfaitement bien si je tape lentement, mais comme nous le savons tous, je ne peux pas attendre des gens d'être patients!

Au moment où je l'ai tapé « casa » la réponse du servlet Je vous appelle est à seulement 3 dossiers longs:

[ 
{"type":"airport","city":"Casablanca","airport":"Anfa","iata":"CAS","country":"Morocco","locationId":"airport_CAS"}, 
{"type":"airport","city":"Casablanca","airport":"Mohammed V","iata":"CMN","country":"Morocco","locationId":"airport_CMN"}, 
{"type":"airport","city":"Casa Grande Municipal, AZ","airport":"Casa Grande Municipal","iata":"CGZ","country":"United States","locationId":"airport_CGZ"} 
] 

Malheureusement, il semble y avoir une certaine bouffonnerie passait là-bas quelque part, que J'ai été incapable de trouver. Au moment où je l'ai tapé « casa », l'objet « aéroports » qui est traité ressemble à ceci:

["Casablanca, Anfa (CAS), Morocco", 
"Casablanca, Mohammed V (CMN), Morocco", 
"Casa Grande Municipal, AZ, Casa Grande Municipal (CGZ), United States", 
"Cascade Locks, OR, Cascade Locks (CZK), United States", 
"Cascavel, Cascavel (CAC), Brazil", 
"Casigua, Casigua (CUV), Venezuela", 
"Casino, Casino (CSI), Australia", 
"Casper, WY, Casper (CPR), United States", 
"Cassilandia, Cassilandia (CSS), Brazil", 
"Castaway, Castaway (CST), Fiji", 
"Castlegar, Castlegar (YCG), Canada", 
"Castres Mazamet, Castres Mazamet (DCM), France", 
"Castro Gamboa, Castro Gamboa (WCA), Chile", 
"Casablanca, Anfa (CAS), Morocco", 
"Casablanca, Mohammed V (CMN), Morocco", 
"Casa Grande Municipal, AZ, Casa Grande Municipal (CGZ), United States", 
"Casablanca, Anfa (CAS), Morocco", 
"Casablanca, Mohammed V (CMN), Morocco", 
"Casa Grande Municipal, AZ, Casa Grande Municipal (CGZ), United States"] 

Comme vous pouvez le voir, il y a des doublons des 3 résultats que je me attends au moment , ainsi que des doublons d'enregistrements qui auraient dû être filtrés à ce moment-là. Dois-je attendre d'une manière ou d'une autre entre les appels ou vérifier les doublons? Je ne suis pas très sûr de la façon d'aborder ce problème, et j'apprécierais certaines contributions ou suggestions.

Répondre

5

résolu le problème en déplaçant

airports = []; 

dans la fonction de réussite.