#jquery #json #autocomplete
#jquery #json #автозаполнение
Вопрос:
Всем привет и заранее спасибо за помощь. прежде всего, прошу прощения, если я использую здесь неправильную фразу. Я не так беспокоюсь о синтаксисе здесь, просто заставляю это работать. Теперь проблема: у меня есть сериализатор django, выводящий следующий JSON:
[
{
"pk": 11262,
"model": "dict.words",
"fields": {
"lang": "KO",
"incorrect": null,
"sug_translation": [
3215
],
"word": "uc0dduac01ud558ub2e4",
"definition": [],
"pos": "VE",
"phrase": [],
"translation": [
{
"pk": 1,
"model": "dict.words",
"fields": {
"word": "comprender"
}
},
{
"pk": 6028,
"model": "dict.words",
"fields": {
"word": "entender"
}
}
],
"incomplete": null
}
}
]
Что я хотел бы сделать, так это перейти к fields.translation.поля.слова и, следовательно, Jquery для автозаполнения
$(function() {
$( "#query_form" ).autocomplete({
minLength: 2,
source: 'http://127.0.0.1:8000/json_results/',
focus: function( event, ui ) {
$( "#query_form" ).val( ui.item.word );
return false;
},
select: function( event, ui ) {
$.get ('http://127.0.0.1:8000/json_detail/',
{
item: ui.item.pk
},
function(data) {
$('#query_result').prepend(data);
});
$( "#query_form" ).val( ui.item.word );
return false;
}
})
.data( "autocomplete" )._renderItem = function( ul, item ) {
var tran = $.each(item.fields.translation, function(i){item.fields.translation[i].fields.word})
return $( "<li></li>" )
.data( "item.autocomplete", item )
.append("<a>" item.fields.word tran "</a>")
.appendTo( ul );
};
});
Я полный новичок в jquery и javascript в целом, поэтому прошу прощения за любые явные ошибки форматирования. В любом случае, проблема здесь в том, что, хотя это действительно выполняет запрос и функции автозаполнения, $.each(item.fields.translation, функция(i) item.fields.translation[i].fields.word}) возвращает [object, Object] в списке автозаполнения. Если я вывожу его через alert(), он возвращает правильные значения. Если я просто использую item.fields.translation[0].поля.слово в строке .append выводит значение. Но по какой-то причине, когда я прошу его сделать то, что я хочу, я получаю [object Object]
Итак, у кого-нибудь есть идеи, что я делаю не так? Заранее огромное спасибо!
Ответ №1:
Вы устанавливаете свою переменную tran
равной $.each()
функции, которая возвращает jQuery
. Вот почему он становится объектом.
Я не совсем понимаю, что именно вы пытаетесь сделать. Вы перебираете элементы в item.fields.translation
массиве, но в конечном итоге выполняете добавление, как если бы этот цикл должен возвращать только одну строку. Но item.fields.translation
в его массиве есть два элемента, так что… Вы могли бы создать массив, подобный этому:
var tran = [];
$.each(item.fields.translation, function(i){
tran.push(item.fields.translation[i].fields.word);
});
//tran now equals ['comprender','entender']
Не уверен, поможет ли это. Если вы уточните, чего вы ожидаете tran
, тогда я мог бы помочь дальше.
И еще одно замечание: вы можете передать значение элемента в текущей итерации — а не только его индекс / ключ — функции внутри $.each()
. Например:
$.each(item.fields.translation, function(i,v){
//the following is the same as tran.push(item.fields.translation[i].fields.word);
tran.push(v.fields.word);
});
Комментарии:
1. Этот первый пример — именно то, что я искал. Я понятия не имел о push (как я уже сказал, полный новичок в js), так что ты, мой друг, мой новый герой. Спасибо, спасибо, спасибо! Сработало сразу: D