Question Typeahead.js - Recherche dans plusieurs valeurs de propriété


S'il vous plaît voir l'exemple ci-dessous.

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

Comment je fais typeahead.js (0.10.1) rechercher des correspondances dans plus d'une valeur de propriété? Idéalement, dans l'ensemble data (data.title, data.desc et en tout 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);
 },

Exemple complet:

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

21
2018-02-18 10:21


origine


Réponses:


Typeahead 0.10.3 a ajouté "la prise en charge des objets jetons pour la segmentation de plusieurs propriétés".

Donc, votre exemple devient

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

Cependant, je ne pense pas que cela fonctionnera pour les propriétés imbriquées à l'intérieur, c'est-à-dire le data.category objet dans votre cas.

En guise de remarque, si vous utilisez des données pré-extraites, veillez à effacer d'abord le stockage local, sinon le nouveau tokenizer ne prendra pas effet (car datumTokenizer est utilisé lors de l'ajout à l'index de recherche et si des données sont déjà présentes dans localStorage, alors l'index de recherche ne sera pas mis à jour). Je suis resté bloqué pendant un moment!


25
2017-09-29 08:40



return Bloodhound.tokenizers.whitespace(data.title) renvoie un tableau de chaînes.

Donc, au lieu de retourner cette valeur: enregistrez-la (et vos autres valeurs souhaitées), puis concaténez-les et renvoyez cette valeur ...

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

13
2018-04-04 14:04



J'ai mis en place une solution ici:

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

Comme vous avez une source de données locale, vous devez créer des jeux de données individuels pour vous permettre de faire correspondre plusieurs propriétés de données. par exemple.

$('#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()
});

5
2018-02-18 22:58