#jquery #json #persistence #getjson
#jquery #json #сохранение #getjson
Вопрос:
Я использую .getJSON для отправки поискового запроса на мой PHP-сервер и возвращаю массив, который был json_encode’d. Я хотел бы использовать результирующий объект после завершения функции jQuery (в идеале, поместив его в массив, и использовать его как любой другой объект в другом месте страницы.
Но объект перестает существовать после завершения функции. Это успех:
var widgets = new Array();
$.getJSON('/server.php', {query: search.value}, function(response) {
widgets.push(response);
alert('value of result's attribute1 is ' widgets[widgets.length].attribute1);
});
Однако, как только я покидаю функцию, widgets.push[длина] становится нулевым, и я не могу получить доступ ни к чему о перемещаемом объекте. Я бы подумал, что это будет копия, а не ссылка?
Мое приложение предполагает, что пользователь выполняет несколько из этих поисковых запросов, чтобы создать список виджетов, а затем работает с атрибутами каждого объекта. Существует ли общепринятый способ сделать эти данные постоянными после завершения функции?
Комментарии:
1. Какова область
widgets
? Является ли это (и ваш вызовgetJSON
) внутри другой функции? Попробуйте удалитьvar
передwidgets = new Array()
; это гарантирует, что вы создаете глобальную переменную (при условии, чтоwidgets
она не объявлена во внешней области видимости).2. Извините, должен был объяснить — виджеты являются глобальными, первое объявление в <script> . И да, этот вызов .getJSON запускается при добавлении результата в текстовое поле автозаполнения (поисковое значение, поступающее оттуда).
3. Хорошо, тогда откуда вы попытаетесь получить доступ
widgets
позже?4. Доступ происходит после создания второго виджета … и так далее по мере добавления новых виджетов в массив. Согласны ли вы, что widgets.push должен быть выполнен успешно, если он помещен в обратный вызов .getjson’s success?
Ответ №1:
Я думаю, что вы проверяете неправильный индекс массива.
widgets[widgets.length - 1]
Это могут быть другие вещи… но это может быть именно так.
Комментарии:
1. Это верно — индекс также был неправильным. Ошибка в моей транскрипции.
Ответ №2:
Вызов getJSON выполняется асинхронно или независимо от остальной части вашего JavaScript. Ваша проблема, скорее всего, связана с тем, что ваш вызов getJSON не завершен до того, как вы попытаетесь манипулировать вашим массивом виджетов.
Вам нужно убедиться, что любые манипуляции с виджетами происходят после завершения getJSON.
Часть синтаксиса getJSON позволяет добавлять функцию обратного вызова при успешном выполнении. Смотрите http://api.jquery.com/jQuery.getJSON /. Поместите ВЕСЬ код управления вашим виджетом в «успех».
Комментарии:
1. Спасибо, это то, что я ищу — все идет в обратный вызов ‘success’.
Ответ №3:
Создание «маленького» виджета, необходимого для загрузки результатов jsonP (содержимого виджета) в контейнер виджета….
У меня это работает …. ах-раз, ах-два, ах-три и четыре….
-
глобальная переменная «array»
var widgetContents = [];
-
запрос в формате json….
$.getJSON(jsonp_url, function(results) { $.each(results, function(i, value) { widgetContents[i] = value; // console.log( i " => " value); }); var success = true; });
-
проблемы с отладкой или обнаружением…
if ( widgetContents.length == 0 || success != true ) { alert("Opps... something went wrong in the backroom...."); }
-
результаты обработки….
else { $.each(widgetContents, function(index, value) { $('#' contentsID).append(value); /* or whatever you need to do.... */ }); }