2010-11-16 4 views
0

Я пытаюсь вернуть список выбранных параметров в функцию добавления JqGrid. У меня есть функция javascript/jquery, которая выполняет GET, чтобы получить строку, предварительно отформатированную для работы с JqGrid. У меня возникли проблемы с возвратом результатов в JqGrid. Как вернуть данные из функции jQuery Get?jquery function with variable problem

function getDealerPoolSelectOptions() { 
var selectOptions = "1:A;"; 
$.get("DealerManagement/GetAllDealerPoolCodes", function(data) { 
    alert("Data: " + data.toString()); //Displays all the data I'm looking for 
    selectOptions = data; 
}); 
alert("SelectOptions: " + selectOptions); //Just Displays the 1:A 
return selectOptions; 
} 
+0

Вы пытались выполнить 'selectOptions = data.toString()'? – cambraca

+0

yes Я попытался добавить toString почти везде, но, похоже, это не имеет значения. На самом деле это уже строка. – MaxGeek

+1

О, я вижу вашу проблему, '$ .get' является асинхронным, поэтому selectOptions устанавливается после возврата функции (код внутри запускается после запроса возвращается с сервера) – cambraca

ответ

2

$.get начинает асинхронный запрос AJAX и вызывает ваш обратный вызов function(data) ..., как только это будет сделано. $.get сам возвращается до завершения запроса. Часть alert("SelectOptions ...") запускается немедленно (до получения данных), так что selectOptions еще не установлен.

0

Предупреждение вызывается перед selectOptions = data;, потому что функции ajax называются асинхронно. Если вы хотите, чтобы что-то произошло, например, добавление данных в сетку, вызовите его в обратном вызове get после того, как вы установите данные selectOptions.

2

jQuery ajax по умолчанию делает асинхронный запрос (что означает, что он сделает запрос в фоновом режиме, не блокируя выполнение в остальной части функции).

EDIT: Хотя вы можете делать синхронные запросы, я должен отметить, что это очень обескураживает. Вместо этого вы должны разработать свой код таким образом, чтобы использовать программирование, управляемое событиями.

Вы можете сделать синхронный запрос, как это:

function getDealerPoolSelectOptions() { 
    var selectOptions = "1:A;"; 
    $.ajax({ 
     async: false, 
     url: "DealerManagement/GetAllDealerPoolCodes", 
     success: function(data) { 
      alert("Data: " + data.toString()); //Displays all the data I'm looking for 
      selectOptions = data; 
     } 
    }); 
    alert("SelectOptions: " + selectOptions); 
    return selectOptions; 
} 
+0

-1 для рекомендации асинхронных запросов. Это быстрый способ исправить этот код, но, несомненно, также неправильный путь. – lonesomeday

+0

@ lonesomeday Я бы не сказал _undoubtedly_, но в большинстве случаев вы были бы правы. Синхронные запросы имеют свое место в мире – cambraca

+0

Достаточно справедливо. Добавлен отказ от ответственности. – mike

1

Вероятно, вы должны описать исходную проблему. Что вы хотите делать с jqGrid?

Вы хотите заполнить поле для редактирования или поиска данными с сервера? Вы должны использовать dataUrl из editoptions или searchoptions. Функция (dataUrl) вводится точно для загрузки данных на ajax.

Если данные, которые вы можете предоставить с сервера, могут быть только JSON, а не в формате, который ожидает jqGrid, вы можете использовать buildSelect дополнительно для переформатирования данных, возвращаемых с сервера. Для получения дополнительной информации см. Мой old answer.