Ajax вызов заполнить Typeahead Bootstrap
То, что я пытаюсь сделать, это получить json-объект через Ajax и заполнить Bootstrap Typeahead только одним видом.
Вот мой код:
nameTypeHead: function () {
var _self = this,
searchInput = $('#nameTypeHead'),
arr = [];
function getArray() {
$.ajax({
url: '/Home/AutoComplete',
type: 'post',
dataType: 'json',
data: { searchText: searchInput.val() },
success: function (data) {
$.each(data, function () {
arr.push(this.Name);
});
return arr;
}
});
}
searchInput.typeahead({
source: getArray()
});
}
Я получаю сообщение об ошибке arr null
Я также пробовал с .parseJSON()
, но без успеха:
$.each($.parseJSON(data), function () {
arr.push(this.Name);
});
Что я могу сделать, чтобы показать только значение Имя моего объекта Json в Typeahed?
Если в Ajax Success я положил alert(JSON.stringify(data));
, он правильно предупредил мой Json Object.
Ответы
Ответ 1
Я сделал это с нуля:
$('#typeahead').typeahead({
source: function (query, process) {
return $.getJSON(
'path/to/lookup',
{ query: query },
function (data) {
return process(data);
});
}
});
Где data
- простой массив JSON, например:
[
"John",
"Jane",
"Alfredo",
"Giovanni",
"Superman"
]
Если ваш массив data
имеет другую структуру, просто переставьте его, прежде чем передавать его методу process()
.
Вы можете найти живой пример здесь.
EDIT - на основе ваших данных json:
[
{'id':'0', 'name':'John'},
{'id':'1', 'name':'Jane'},
{'id':'2', 'name':'Alfredo'},
...
}
Обратный вызов getJSON
будет выглядеть следующим образом:
function (data) {
var newData = [];
$.each(data, function(){
newData.push(this.name);
});
return process(newData);
});
Ответ 2
Оформить этот вопрос. Выполняет автозаполнение, имеет дело с быстрыми машинами и кешами.
https://gist.github.com/mrgcohen/5062352
Ответ 3
Это то, что сработало для меня: -
Настройка HTML:
<!-- HTML Setup-->
<input type="text" id="my-typeahead" />
Javascript:
/*
example remote-data-source
[
{
id:1,
name:'Batman'
},{
id:2,
name:'Superman'
}
]
*/
$('#my-typeahead').typeahead({
hint: true,
highlight: true,
minLength: 1
}, {
name: 'myDataset',
source: function(str, sync, async) {
// abstracting out the "REST call and processing" in a seperate function
restCall(str, async);
},
templates: {
suggestion: function(user) {
return '<div>' + user.name + '</div>';
},
pending: '<div>Please wait...</div>'
}
});
// The function that will make the REST call and return the data
function restCall(str, async) {
return $.ajax('http://url-for-remote-data-source/query?name=' + str, {
// headers and other setting you wish to set-up
headers: {
'Content-Type': 'application/json',
},
// response
success: function(res) {
//processing data on response with 'async'
return async(res.data);
}
});
}
Литература:
Typeahead Docs - Datasets
: https://github.com/twitter/typeahead.js/blob/master/doc/jquery_typeahead.md#datasets
Jquery **$.ajax()**
: https://api.jquery.com/jquery.ajax/
Удачи.