Typeahead.js - поиск по нескольким значениям свойств
Пожалуйста, смотрите пример ниже.
JSFiddle: http://jsfiddle.net/R7UvH/2/
Как заставить typeahead.js (0.10.1) искать совпадения в более чем одном значении свойства? В идеале, в целом data
(data.title
, data.desc
и во всех 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);
},
Весь пример:
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>'
}
});
3 ответа
В Typeahead 0.10.3 добавлена "поддержка токенайзеров объектов для токенизации нескольких свойств".
Итак, ваш пример становится
var posts = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('title', 'desc'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
local: data
});
Тем не менее, я не думаю, что это будет работать для свойств, вложенных внутрь, то есть data.category
возражать в вашем случае.
В качестве примечания: если вы используете предварительно выбранные данные, сначала обязательно очистите локальное хранилище, иначе новый токенизатор не вступит в силу (поскольку datumTokenizer
используется при добавлении в поисковый индекс и если данные уже присутствуют в localStorage
, то поисковый индекс не будет обновляться). Я застрял на этом некоторое время!
return Bloodhound.tokenizers.whitespace(data.title)
возвращает массив строк.
Итак, вместо того, чтобы возвращать это значение: сохраните его (и другие нужные значения), затем объедините их и верните это значение...
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);
Я реализовал решение здесь:
http://jsfiddle.net/Fresh/4nnnG/
Поскольку у вас есть локальный источник данных, вам нужно создать отдельные наборы данных, чтобы позволить вам сопоставлять несколько свойств данных. например
$('#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()
});