Смущен обработкой моих данных в jQuery - PullRequest
1 голос
/ 29 июля 2011

Так что, вероятно, не самый лучший заголовок, но я думаю, что это происходит.

Я написал этот вопрос , желая заполнить раскрывающийся список в моем jqGrid, чтобы пользователь мог выбрать из доступных вариантов для фильтрации. Предоставленное решение работает в одном случае, но не в другом. Первый тип, который извлекает данные (для выпадающего фильтра заголовка столбца), моя трассировка стека выглядит так:

callback() jquery-1.6.2.js (line 7947)
_ = readystatechange

done() jquery-1.6.2.js (line 7183)
status = 200
statusText = "success"
responses = Object { text="["Cake", "Sugar", "Waffle"]" }
headers = "Server: ASP.NET Develop...: 22\nConnection: Close\n"

resolveWith() jquery-1.6.2.js (line 1008)
context = Object { url="/IceCream/AvailableConeTypes", isLocal=false, more...}
args = [ Object { readyState=4, responseTExt="["Cake", "Sugar", "Waffle"]", more...} "success"]

complete() jquery...src.js(line 3591)
res = Object { readyState=4, responseText="["Cake", "Sugar", "Waffle"]", more...}
status = "success"

myBuildSelect() Cone (line 75)
data = Object { readyState=4, responseText="["Cake", "Sugar", "Waffle"]", more...}

во второй раз, когда это вызывается (для диалогового окна фильтра панели инструментов jqGrid, позволяющего создавать несколько фильтров И / ИЛИ), трассировка стека немного отличается:

callback() jquery-1.6.2.js (line 7947)
_ = readystatechange

done() jquery-1.6.2.js (line 7168)
status = 200
statusText = "success"
responses = Object { text="["Cake", "Sugar", "Waffle"]" }
headers = "Server: ASP.NET Develop...: 22\nConnection: Close\n"

resolveWith() jquery-1.6.2.js (line 1008)
context = Object { elem=, options={...} }
args = [ "["Cake", "Sugar", "Waffle"]", "success", Object { readyState=4, responseText="["Cake", "Sugar", "Waffle"]", more...} ]

success() jquery...src.js(line 5099)
data ="["Cake", "Sugar", "Waffle"]"
status = "success"

myBuildSelect() Cone (line 75)
data = ="["Cake", "Sugar", "Waffle"]"

Я не совсем понимаю, что здесь происходит. Глядя на файл jquery-1.6.2.js в ссылочных строках, я вижу, что в первом случае он выполняет строку:

deferred.resolveWith { callbackContext, [success, statusText, jqXHR] );  (line 7168)

и во втором случае выполняет строку:

completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText] );  (line 7183)

Похоже, что вещи кэшируются или обрабатываются по-разному, когда во второй раз выполняется вызов этого действия контроллера. Я могу опубликовать дополнительный код, если это полезно, но это по сути то, что я написал в моем предыдущем вопросе вместе с решением Олега. Идеи?

1 Ответ

1 голос
/ 29 июля 2011

Прежде всего, я бы порекомендовал вам использовать последнюю версию 4.1.2 jqGrid вместо очень старой версии 4.0.0 (номера строк jquery.jqGrid.src.js, которые вы включили в вопрос, взяты из v4.0.0),Версия 4.1.2 включает в себя множество исправлений ошибок.

Причина возникшей проблемы заключается в следующем.Для обработки ответа сервера можно использовать обработчики событий complete или success и error jQuery.ajax .Старый код jqGrid везде использовал обработчик событий complete.Это был не лучший способ, поэтому во многих местах , но не везде (!!!) код jqGrid был изменен, и в основном не используются обработчики success и error.Внутри обработчика complete параметр data имеет тип string (в вашем случае в формате JSON).Поэтому нужно сделать дополнительный вызов $. ParseJSON , чтобы преобразовать данные в объект.Внутри success уже обработанные data соответствуют HTTP-заголовку «Content-Type» ответа сервера и параметру dataType $.ajax.

Можно найти в источникекод jqGrid, который buildSelect будет вызываться в filterToolbar внутри обработчика complete и вызываться в createEl внутри обработчика success.Это проблема, которая у вас есть.

Рекомендую опубликовать описание проблемы в виде отчета об ошибке на форуме trirand , или я могу сделать это для вас.

В качестве обходного пути я предлагаю изменить функцию buildSelect, которую я предложил в моем ответе на ваш предыдущий вопрос, следующим образом:

my.buildSelect = function(data) {
    var response = typeof(data) === "string" ?
                       jQuery.parseJSON(data.responseText):
                       data,
        s = '<select>', i, l, ri;

    if (response && response.length) {
        for (i=0, l=response.length; i<l; i += 1) {
            ri = response[i];
            s += '<option value="' + ri + '">' + ri + '</option>';
        }
    }
    return s + '</select>';
};

Поэтому я предлагаю протестироватьтип входного параметра data.После изменений код должен работать во всех ситуациях, и он все равно будет работать, если jqGrid будет изменен на использование обработчика success вместо обработчика complete везде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...