Typeahead.js: принудительная перезагрузка локального набора данных

Я хочу реализовать необработанный резервный вариант, аналогичный веб-приложению Twitter, где у него есть окончательный вариант автозаполнения значения ввода (например, Search all people for {{input.val()}}):

Резервный поиск всех людей для {{input.val()}}

Моя текущая реализация дает сбой, потому что Typeahead.js не перезагружает локальные наборы данных, поэтому происходит только желаемый эффект при первом событии keyup:

var plusone = [
    {
        value: '',
        tokens: ''
    }
];

$('#name').keyup(function () {
    plusone[0].value = $('#name').val();
    plusone[0].tokens = $('#name').val();
});

$('#name').typeahead(
    [
        {
            local: plusone
        }
    ]
);

Согласно документации и этому руководству нет способа повторно инициализировать ввод без его предварительного уничтожения, что я бы предпочел не делать для производительности. Будем очень признательны за любые предложения по лучшей реализации или исправлению (если есть кто-то из Twitter, я хотел бы узнать о вашей реализации).


person Ryan Brodie    schedule 23.07.2013    source источник
comment
В версии 0.9.x нет хорошего способа реализовать эту функциональность, но я надеюсь, что вы сможете сделать это в версии 0.10. Как только я выпущу v0.10, я вернусь сюда и дам правильный ответ.   -  person jharding    schedule 24.07.2013
comment
@jharding Хорошо, спасибо за обновление, я с нетерпением жду надежного решения.   -  person Ryan Brodie    schedule 24.07.2013
comment
Броди, ты когда-нибудь находил решение? Я столкнулся с такой же ситуацией и задался вопросом, что вы придумали.   -  person David Robbins    schedule 06.02.2014
comment
@DavidRobbins v0.10 Typeahead уже вышла - у меня не было времени в нее вникнуть, но похоже, что вышеизложенное теперь легко достижимо. Отпишусь, когда узнаю.   -  person Ryan Brodie    schedule 08.02.2014
comment
@ Броди - спасибо. В итоге я пошел по маршруту повторной инициализации, и производительность была не так уж и плоха. В моем случае локальный элемент данных действительно мал - максимум 15 элементов. Работает совместно с Knockoutjs.   -  person David Robbins    schedule 11.02.2014
comment
@jharding, вы должны вернуться, чтобы получить правильный ответ   -  person Bass Jobsen    schedule 05.12.2014


Ответы (1)


Вы можете сделать это, добавив новый набор данных в typeahead с пользовательской исходной функцией.

var nbaTeams = new Bloodhound({
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('team'),
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    prefetch: 'nba.json'
});

nbaTeams.initialize();

$('#autosuggest-input').typeahead({
    highlight: true,
    hint: false
}, {
    name: 'nba-teams',
    displayKey: 'team',
    source: nbaTeams.ttAdapter(),
    templates: {
        header: '<h3 class="league-name">NBA Teams</h3>'
    }
}, {
    name: 'advanced-search',
    displayKey: 'name',
    // For every dataset, typeahead expects you to provide a source property
    // which is a function that accepts two arguments: query and cb. And you
    // can do whatever you want in that function. In this case, what we do
    // is that regardless of the query provided, you will always return the
    // same result.
    source: function(query, cb) {
        var result = [{
            'name': 'Advance search for "' + query + '"'
        }];
        cb(result);
    },
    templates: {
        header: '<div style="border-top: 1px solid black;"></div>'
    }
});

Демо и кредиты: http://plnkr.co/edit/cjL6nZtShyxmLjWxzdBC?p=preview

person Razvan Grigore    schedule 17.05.2015
comment
Теперь это действительно возможно, поскольку выпущена версия 0.10, спасибо за пример. - person Ryan Brodie; 28.10.2015