2014-05-02 13 views
13

uso bloodhound per ottenere alcuni dati per typeahead. La mia Bloodhound Oggetto:typeahead.js: Restituisce tutti i record Bloodhound su query vuota

var lastAdresses = new Bloodhound({ 
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), 
    queryTokenizer: Bloodhound.tokenizers.whitespace, 
    prefetch: { 
    url: '/_dev_data_sources/last_adresses_json.html', 
    }, 
    limit: 20 
}); 



lastAdresses.initialize().done(function() { 
    var query = "L"; 
    lastAdresses.get(query, function(suggestions) { 
    console.log(suggestions); 
    }); 
}); 

Questo funziona bene, quando la mia domanda è "L" come nell'esempio, o di un'altra stringa. Ma voglio che il bloodhound restituisca tutti i record disponibili, quando la mia query è "". Nel mio esempio, non restituisce nulla.

Ho visto, quel segugio ha un argomento di filtro, ma non so come usarlo.

Qualcuno può aiutarmi?

+0

Volete typeahead per visualizzare tutti i suggerimenti non appena viene caricata la pagina? –

+0

Sì, questa era la mia intenzione. Ho visto che il team di typeahead ci sta lavorando ma non posso aspettare. Funziona ora aggiungendo una funzione observer come sorgente che controlla se la query è "" e se è così restituisce tutti i dati come array. – user1383029

+1

Puoi postare il codice da qualche parte per mostrarlo? Devo anche mostrare tutti i record ... Grazie =) – gobwas

risposta

1

Bloodhound utilizza un tipo interno chiamato SearchIndex per la corrispondenza efficiente dei termini della query.

È possibile monkey patchSearchIndex.get modificare i record restituiti per una determinata query.

Questa funzione patch un'istanza Bloodhound per restituire tutti i record per un termine di ricerca vuota:

// Patch the given Bloodhound instance 
// to match all records for an empty query 
function enableMatchAll(bloodhound) { 
    var _get = bloodhound.index.get; 
    bloodhound.index.get = function(query) { 
    if(!query || query === '') { 
     return this.datums; 
    } else { 
     return _get.call(this, query); 
    } 
    } 
} 

JSBin demo

essere consapevoli del fatto che questa patch non documentata utilizza funzionalità interna. Funziona per typeahead/bloodhound v0.10.5; potrebbe o meno funzionare con qualsiasi altra versione.

6

Penso che ci potrebbe essere un modo migliore per farlo. Ma dipende ancora dall'attuazione interna del segugio che può cambiare.

var searchEngine = new Bloodhound({...}); 
function searchWithDefaults(q, sync) { 
    if (q === '') { 
    sync(searchEngine.index.all()); 
    } else { 
    searchEngine.search(q, sync); 
    } 
} 
$("#typeahead").typeahead({ 
    minLength : 0, 
}, { 
    name : 'typeahead', 
    source : searchWithDefaults 
}); 

Questo codice sfrutta realizzazione del motore di ricerca interno Bloodbound chiamato SearchIndex e la sua funzione all() che restituisce elenco completo dei dati memorizzati dal Bloodhound.

Risposta ispira: