Veuillez voir l'exemple ci-dessous.
JSFiddle: http://jsfiddle.net/R7UvH/2/
Comment puis-je faire 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 entier:
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>'
}
});
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élues, assurez-vous d'abord d'effacer 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 les données est déjà présent dans localStorage
, alors l'index de recherche ne sera pas mis à jour). J'étais coincé là-dessus pendant un moment!
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);
J'ai implémenté une solution ici:
http://jsfiddle.net/Fresh/4nnnG/
Comme vous avez une source de données locale, vous devez créer des ensembles 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()
});