2016-02-10 13 views
12

I typeahead Suche bin die Umsetzung typeahaead.js verwenden, aber als Typ in typeahead searchbox, in Vorschlägen jeweils Aufzeichnungen Dropdown kommt twice.I die Datenquelle geprüft (dh POST api-Aufruf), hat es nur einzigartig records.wo mache ich falsch? Irgendwelche Hilfe oder relevante Verbindungen.doppelte Datensätze in typeahead Suche kommenden

Selbst Kontrolle ist nicht zu dup Detektor.

ähnliche Ausgabe discussed here, aber keine Lösung gibt.

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

       } 

      }, 
     }); 
+0

Können Sie eine jsbin oder jsfiddle erstellen, um den Fehler zu reproduzieren? Wenn nicht, können Sie Ihren Code umgestalten, um alles Nicht-Wesentliche (Vorlagen, Hinweise, Bindungen usw.) zu entfernen und zu sehen, was passiert? Console.log in Ihrer Filterfunktion, um zu sehen, was es macht? – whipdancer

+1

Setzen Sie eine console.log in die Filterfunktion - Filter: function (data) {console.log (data); if (data) { return $ .Map (Daten, Funktion (Objekt) {console.log (object); console.log (data.data); console.log (data.data.results); console.log (data.data.results.data); return data.data.results.data; }); } } – whipdancer

+0

Die Filterfunktion als du hast es keinen Sinn für mich macht. Sie sollten mit dem Objekt innerhalb der Map-Funktion arbeiten, aber Sie ignorieren es stattdessen für "Daten". – whipdancer

Antwort

5

Ich fand die Lösung, ich war falsch im Filter. Meine Lösung ist

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

     }) 
Verwandte Themen