#javascript #jquery #ajax #json #typeahead
#javascript #jquery #ajax #json #typeahead
Вопрос:
Я несколько часов рвал на себе волосы с помощью плагина Typeahead от Twitter.
По сути, мы извлекаем данные из веб-службы (веб-сервиса Asmx) с форматом ответа .JSON.
Как только мы получим его через BloodHound, мы преобразуем его в строку, вычеркиваем некоторые дополнительные символы, прежде чем повторно преобразовать его в Json, а затем передать его в Typeahead.
var engine= new Bloodhound({
datumTokenizer: function (d) {
return Bloodhound.tokenizers.whitespace("value")
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
prefetch : {
ttl : 1000,
url : '/webservice.asmx'
},
remote: {
ttl : 1000,
url: '/webservice.asmx',
ajax: {
beforeSend: function (jqXhr, settings) {
jqXhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
settings.data = '{"query":"' $('#inputText').val() '"}';
alert(settings.data);
},
type: "POST",
context: this
},
filter: function (response) {
//return response;
if (response.hasOwnProperty('d')) {
var returned = String(response.d);
returned = returned.slice(14,-1);
var parsedJSON = jQuery.parseJSON(returned);
return parsedJSON ;
}
else {
return response;
}
}
}
});
engine.initialize();
$('#inputText').typeahead(null, {
source: engine.ttAdapter()
});
При вводе в поле ввода код извлекает данные на основе запроса через Ajax ОДИН и ТОЛЬКО ОДИН РАЗ, однако он пропускает их через фильтр несколько раз, когда пользователь вводит больше символов в поле ввода. Я считаю, что это проблема. Поскольку мы должны использовать тип POST из-за метода использования веб-сервиса Asmx, Ajax, похоже, не может выполнить более одного запроса, независимо от того, сколько символов мы вводим в поле ввода.
Как я уже сказал, это сводит нас с ума уже несколько дней, поэтому любая помощь будет невероятно признательна.
Ответ №1:
Этот блог помог решить ответ — http://www.weezey.com/2014/03/bringing-it-all-together /
Похоже, мы немного усложнили ситуацию. Нам все равно пришлось удалить и повторно преобразовать Json, который наш веб-сервер выдавал обратно в разделе Ajax, но мы заставили его работать.