Typeahead.js Вывод класса из объекта в результаты

#javascript #jquery #autocomplete #typeahead.js #typeahead

#javascript #jquery #автозаполнение #typeahead.js #typeahead

Вопрос:

Я использую typeahead для извлечения предложений из базы данных с помощью приведенного ниже кода, они доставляются в виде массива объектов, и я добавляю первое значение в предложение, а затем мне нужно, чтобы второе выводилось как класс вокруг результата.

Например, span class=»flag-{val 1}»> Предложение

Любая помощь с благодарностью.

 $('#typeahead').typeahead(null, {
    source: function(query, process) {
        $.ajax({
            url: 'source.php',
            type: 'POST',
            data: 'query='   query,
            dataType: 'JSON',
            async: true,
            success: function (data) {
                var suggestions = [];
                $.each(data, function(key, val) {
                    var obj = {};
                    obj.label = val;

                    suggestions.push({ value: val[0] });
                    console.log( {value: val[0]}, {value: val[1]});
                });
                return typeof data == 'undefined' ? false : process(suggestions);
            }
        }); 
    }
});
  

консольный журнал

Комментарии:

1. вы изучали пользовательские шаблоны на twitter.github.io/typeahead.js/examples

2. @DaveBriand У меня есть спасибо — не успокоил, дал мне то, что мне было нужно, но теперь нашел хорошее простое решение. Спасибо

3. приятно слышать — я вижу ваш ответ ниже.

Ответ №1:

Я использую undercorejs для создания шаблонов, это добавляет функцию компиляции к подчеркиванию. Typeaheadjs использует компиляцию при сборке из шаблонов.

 _.compile = function(templ) {
    var compiled = this.template(templ);
    compiled.render = function(ctx) {
        return this(ctx);
    }
    return compiled;
} 
  

Согласно примерам на странице github, теперь вы можете использовать шаблоны.

Комментарии:

1. Спасибо, Дэйв, к сожалению, шаблоны все еще не укладываются у меня в голове. Мне удалось удалить теги span перед вставкой all be it с очень сложным таймаутом при размытии, чтобы это сработало. Обновил мой ответ, чтобы показать.

Ответ №2:

По дороге домой с работы мне пришло в голову, что я мог бы попробовать это:

 suggestions.push({ value: '<span class="flag flag-' val[1] '">' val[0] '</span>' });
  

и на самом деле не нужно было бы усложнять ситуацию, изменяя шаблоны typeahead. Это работает! 🙂

В дополнение к этому — добавляя разметки диапазона во входные данные, я создал функцию для их удаления… $(document).on(‘нажать клавишу : фокус: активный’, ‘.tt-предложение’, функция (e){ cleanSuggestion (); e.preventDefault(); });

     $(document).on('keydown', '.tt-input, .typeahead, .tt-hint', function(e){
        if(e.which == 38||e.which == 40||e.which == 13) {
            cleanSuggestion ();
        }
    });

    $(document).on('blur', '.tt-input', function(e){
        setTimeout(function(){
            cleanSuggestion ();
        }, 1);
    });     

    function cleanSuggestion () {
        var registeredValue = $('#registered-stallion').attr('value') 
        registeredValue = registeredValue.replace(/(<([^>] )>)/ig,"");
        $('#registered-stallion').attr('value', registeredValue);           
    }
  

по какой-то причине функция размытия будет работать только с тайм-аутом, так как я не мог точно видеть, где typeahead повторно использовал свою функцию здесь..

Комментарии:

1. ах, за исключением… при щелчке span вставляется в предложение. <span> фрэнк</span>

2. возможно, вы захотите рассмотреть возможность создания небольшого механизма шаблонов и его использования — я опубликую его в ответе, чтобы его можно было отформатировать

3. Спасибо @DaveBriand, если у вас есть время, чтобы смоделировать пример, я был бы очень признателен, мне пока не очень повезло с шаблонизацией — возможно, я пропустил что-то очевидное.