Удаленные запросы Bloodhound работают, но ничего не предлагают

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

Проблема в том, что когда я использую удаленный источник в Bloodhound. Он делает запросы и получает результаты, но когда я просматриваю результаты, ничего не возвращается.

В частности, этот код работает просто отлично:

    categoryEngine = new Bloodhound({                                                                                                                                                                          
        queryTokenizer: Bloodhound.tokenizers.whitespace,                                                                                                                                                      
        datumTokenizer: Bloodhound.tokenizers.obj.whitespace('title'),                                                                                                                                         
        local: [{                                                                                                                                                                                              
            id: 1,                                                                                                                                                                                             
            title: 'Pizza'                                                                                                                                                                                     
        },                                                                                                                                                                                                     
        {                                                                                                                                                                                                      
            id: 2,                                                                                                                                                                                             
            title: 'Pasta'                                                                                                                                                                                     
        }                                                                                                                                                                                                      
        ]                                                                                                                                                                                                      
    });                                                                                                                                                                                                        
    categoryEngine.initialize();                                                                                                                                                                               
    categoryEngine.search('Pi', function(s) {                                                                                                                                                                  
        console.log('food='+JSON.stringify(s));                                                                                                                                                                
    });   

и он регистрирует food=[{"id":1,"title":"Pizza"}] в консоли, что правильно. А вот этот с удаленным источником:

    categoryEngine = new Bloodhound({                                                                                                                                                                          
        queryTokenizer: Bloodhound.tokenizers.whitespace,                                                                                                                                                      
        datumTokenizer: Bloodhound.tokenizers.obj.whitespace('title'),                                                                                                                                         
        remote: {                                                                                                                                                                                              
           url: '/complete/category_title/%QUERY',                                                                                                                      
            wildcard: '%QUERY'                                                                                                                                                                                 
        }                                                                                                                                                                                                      
    });                                                                                                                                                                                                        
    categoryEngine.initialize();                                                                                                                                                                               
    categoryEngine.search('Pi', function(s) {                                                                                                                                                                  
        console.log('food='+JSON.stringify(s));                                                                                                                                                                
    });

Делает запрос к серверу:

GET /complete/category_title/Pi HTTP/1.1
Host: XXXXX
Connection: keep-alive
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36
Referer: YYYYY
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,fa;q=0.6
Cookie: PHPSESSID=ZZZZZ

и принимает этот ответ:

HTTP/1.1 200 OK
Host: XXXXX
Connection: close
X-Powered-By: PHP/5.6.8
Cache-Control: no-cache
Date: Sun, 10 May 2015 14:24:22 GMT
Content-Type: application/json

[{"id":13,"title":"Pizza"}]

Что тоже кажется правильным, но метод search не работает, и строка отладки выводит food=[] в консоль, так как не возвращает никаких результатов.

Я использую эти библиотеки:

  • jQuery v1.11.2
  • jQuery Миграция v1.2.1
  • Пользовательский интерфейс jQuery v1.11.2
  • Начальная загрузка v3.3.1
  • Упреждающий ввод v0.11.1

person mdh.heydari    schedule 10.05.2015    source источник
comment
Столкнулись с той же проблемой, какое-нибудь правильное решение?   -  person Lovepreet Singh Batth    schedule 26.09.2017


Ответы (1)


Судя по всему, проблема в том, что Bloodhound.search возвращает асинхронные (удаленные) результаты во втором обратном вызове (3-й параметр) (Bloodhound.search). Вы должны изменить свой код на:

var cb = function(s) {console.log('food='+JSON.stringify(s));};
categoryEngine.search('Pi', cb, cb);
person Amit    schedule 10.05.2015
comment
Спасибо, это работает! Я использовал механизм предложений с typeahead и дал ему categoryEngine.ttAdapter() в качестве источника, хотя возникла та же проблема. Я могу использовать этот метод и написать исходную функцию typeahead самостоятельно. Но код будет уродливым, и мне интересно, как этот пример работает, а мой нет? - person mdh.heydari; 12.05.2015