Por favor vea el ejemplo de abajo.

JSFiddle: http://jsfiddle.net/R7UvH/2/

¿Cómo puedo hacer typeahead.js (0.10.1) la búsqueda de coincidencias en más de un valor de la propiedad? Idealmente, dentro de toda la data (data.title, data.desc y en todos los data.category[i].name)

 datumTokenizer: function(data) {
     //**search in other property values; e.g. data.title & data.desc etc..**
     return Bloodhound.tokenizers.whitespace(data.title);
 },

Entero ejemplo:

var data = [{
    title: "some title here",
    desc: "some option here",
    category: [{
        name: "category 1",
    }, {
        name: "categoy 2",
    }]
},
{
    title: "some title here",
    desc: "some option here",
    category: [{
        name: "category 1",
    }, {
        name: "categoy 2",
    }]
}];

var posts = new Bloodhound({
    datumTokenizer: function(data) {
        //**search in other property values; e.g. data.title & data.desc etc..**
        return Bloodhound.tokenizers.whitespace(data.title);
    },
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    local: data
});
posts.initialize();

$('#search-input').typeahead({
    highlight: true
}, {
    name: 'Pages',
    displayKey: 'title',
    source: posts.ttAdapter(),
    templates: {
        header: '<h3>Pages</h3>'
    }
});
InformationsquelleAutor Iladarsda | 2014-02-18

3 Comentarios

  1. 29

    Typeahead 0.10.3 agregó que «el apoyo a objeto tokenizers para varios de la propiedad de segmentación.»

    Así, su ejemplo se convierte en

    var posts = new Bloodhound({
        datumTokenizer: Bloodhound.tokenizers.obj.whitespace('title', 'desc'),
        queryTokenizer: Bloodhound.tokenizers.whitespace,
        local: data
    });

    Sin embargo, no creo que esto funcionará para propiedades anidadas dentro, es decir, la data.category objeto en su caso.

    Como una nota de lado, si usted está utilizando prefetched de datos, asegúrese de desactivar el almacenamiento local en primer lugar, de lo contrario el nuevo tokenizer no tomará efecto (Porque datumTokenizer se utiliza cuando se añade al índice de búsqueda, y si los datos ya están presentes en localStorage, entonces el índice de búsqueda no va a ser actualizado). Yo estaba atrapado en esto por un rato!

    • seguimos trabajando en @timoteo solución para los días pero no me funciona. Esta solución funciona y es más elegante.
    • Gran solución, gracias. Nota de lado, usted puede prevenir el prefetch cache con prefetch: { cache: false, ... }
    • Esto funciona, pero alerta: debe especificar las propiedades en el orden en que aparecen en los datos del esquema; de lo contrario, no funcionará. Creo que este es un error en el typeahead ya que es sorprendente para el usuario.
  2. 14

    return Bloodhound.tokenizers.whitespace(data.title) devuelve una matriz de cadenas.

    Así que, en lugar de devolver ese valor: guardar (y a tus otros valores deseados), luego concatenar y devolver ese valor…

    x = Bloodhound.tokenizers.whitespace(data.title);
    y = Bloodhound.tokenizers.whitespace(data.desc);
    z = Bloodhound.tokenizers.whitespace(data.category[i].name);
    return x.concat(y).concat(z);
  3. 6

    He implementado una solución aquí:

    http://jsfiddle.net/Fresh/4nnnG/

    Ya que tiene un local de origen de datos que usted necesita para crear distintos conjuntos de datos que permite buscar en varias propiedades de datos. por ejemplo,

    $('#search-input').typeahead({
        highlight: true
    }, {
        name: 'titles',
        displayKey: 'title',
        source: titles.ttAdapter()
    }, {
        name: 'descs',
        displayKey: 'desc',
        source: descs.ttAdapter()
    }, {
        name: 'cats',
        displayKey: 'name',
        source: cats.ttAdapter()
    });
    • (^_*) Permanecer @Fresco
    • @NullSoulException 😀
    • gracias por tomarse el tiempo, es un poco más complicado de lo que yo inicialmente presentada. Estoy utilizando múltiples fuentes (que se clasifican con headers-exactamente de la misma como por typeahead.js multi fuente demo twitter.github.io/typeahead.js/ejemplos). Puede que me apunte a un ejemplo de la utilización del filtro? Por favor, tenga en cuenta que quiero mantener la categorización de los encabezados (medios de comunicación, páginas, mensajes). gracias
    • He estado buscando en el camino de filtro() y lo que yo pensaba que iba a ayudar a que no iba a funcionar es decir, crear una lista de tokens en el filtro. Creo que se debería implementar una solución con la forma en que he indicado en mi respuesta, excepto que usted necesitará agregar la categorización de los encabezados como usted sugiere. La esperanza de encontrar una solución y voy a estar interesado en ver!

Dejar respuesta

Please enter your comment!
Please enter your name here