Twitter Typeahead.js, как вернуть все согласованные элементы внутри строки

По умолчанию twitter typeahead.js возвращает только элементы, сопоставленные в начале строки, например:

источник: ['type', 'typeahead', 'ahead']

query: 'type'

возвращает: 'type' и 'typeahead'

-

запрос: "вперед"

возвращает: "вперед"

Я хочу, чтобы он возвращал "вперед" и "typeahead"

мой код:

var clients = new Bloodhound({
    datumTokenizer: function(d) { return Bloodhound.tokenizers.whitespace(d.value); },
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    limit: 10,
    prefetch: {
        url: '/clients.json',
        filter: function(list) {
            return $.map(list, function(value) { return { name: value }; });
        }
    }
});

clients.initialize();

$('.client').typeahead(null, {
    displayKey: 'value',
    source: clients.ttAdapter(),
    minLength: 1,
});

Уже есть вопрос об этом, но я не понял ответа.

Ответы

Ответ 1

Я нашел решение... проблема в том, что я так привык к bootstrap2 typeahead, что я не понимал вещь datumTokenizer. Если кому-то еще трудно понять, я опишу небольшое описание ниже:

queryTokenizer: массив запросов, которые вы запрашиваете, если вы запрашиваете 'test abcd', он преобразует строку в ['test', 'abcd'] и ищет совпадения с этими двумя словами.

datumTokenizer: массив слов, который будет сопоставлен с queryTokenizer. Каждый элемент из вашего JSON будет иметь набор слов для соответствия.

Итак, если у вас есть источник:

['good test', 'bad test']

и запрос для "est". Вам нужно сделать datumTokenizer вернуть массив, содержащий "est", что-то вроде:

['good', 'test', 'ood', 'od', 'test', 'est', 'st'] для первого элемента

['bad', 'ad', 'test', 'est', 'st'] для второго элемента

Bellow - это код, который я написал, я не знаю, насколько это оптимально для него, но я думаю, что это все равно поможет:

new Bloodhound({
    datumTokenizer: function(d) {
        var test = Bloodhound.tokenizers.whitespace(d.value);
            $.each(test,function(k,v){
                i = 0;
                while( (i+1) < v.length ){
                    test.push(v.substr(i,v.length));
                    i++;
                }
            })
            return test;
        },
    queryTokenizer: Bloodhound.tokenizers.whitespace, 
    limit: 10,
    prefetch: {
        url: '/lista.json',
        ttl: 10000
    }
});