Подтвердить что ты не робот

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

Ответ 1

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, тогда индекс поиска не будет обновляться). Я застрял на этом какое-то время!

Ответ 2

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

Ответ 3

Я реализовал решение здесь:

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