Ответ Typeahead.js JSON не отображается

Я пытаюсь интегрировать Twitter Typeahead в свой проект Laravel (4.2.11) (с Bootstrap 2.3.2).
У меня есть результаты, возвращаемые в виде JSON (проверено с помощью Fiddler), но вместо этого всегда отображается одно «неопределенное».
Если я ввожу поисковый запрос, который не возвращает никаких результатов, "Нет результатов" отображается правильно.

//Simple query in Laravel
Route::get('/sidebar/clients/{q}', function($q)
{
   $companies = DB::table('ViewCompanies')->select(array('CompanyID', 'FullCompanyName'))
                    ->where('FullCompanyName', 'like', '%'. $q .'%')->get();

   return Response::json(array('companies' => $companies));
});
//Javascript in page
var clients = new Bloodhound({
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('FullCompayName'),
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    remote: { 
        url: '/sidebar/clients/%QUERY',
        filter: function (parsedResponse) {
            // parsedResponse is the array returned from your backend
            console.log(parsedResponse);
            return parsedResponse;
        }            
    }
});

clients.initialize();

$('#clients .typeahead').typeahead({
    hint: true,
    highlight: true,
    minLength: 3,
},
{
    name: 'clients',
    valueKey: 'CompanyID',
    displayKey: 'FullCompanyName',
    source: clients.ttAdapter(),
    templates: {
        empty: [
            '<div class="tt-empty-message">',
            'No Results',
            '</div>'
        ],
        header: '<h3 class="tt-tag-heading tt-tag-heading2">Matched Companies</h3>'
    }

});

Мой консольный журнал с использованием приведенного выше кода:

Журнал консоли Chrome


person SteB    schedule 13.11.2014    source источник


Ответы (2)


каков результат parsedResponse, который вы регистрируете? Я думаю, что DB::table возвращает объект, а не массив. Попробуйте заменить ответ следующим образом:

return Response::json(array('companies' => $companies->toArray()));

Затем зарегистрируйте результаты и отформатируйте их в функции «фильтр» в объекте Bloodhound. Надеюсь, поможет!

person Eduardo Pacios    schedule 13.11.2014
comment
Попробовал, затем я получаю «Нет результатов» для запроса, который ранее возвращал 4 записи. Я добавляю журнал консоли для своего исходного кода. - person SteB; 14.11.2014

Спасибо Эдуардо за то, что он подал мне идею о необходимости разобрать мой JSON в массив JS.

Выполнение поиска выявило эти два вопроса:

из которого я смог разработать свое однострочное решение (полное удаление фильтра):

        filter: function (parsedResponse) {
            console.log(parsedResponse);
            var parsedResponse = $.map(parsedResponse, function(el) { return el; });
            return parsedResponse;
        }            
person SteB    schedule 14.11.2014