Проблема с $ .each в jquery

Я пытаюсь заполнить форму поиска jqGrid с помощью элемента SELECT. В colModel для интересующего столбца у меня есть

searchoptions: {
    dataUrl: '<%: Url.Content("~/Contact/GetCustomers") %>',
    buildSelect: function (response) {
        var theSelect = "<select>";
        $.each(response, function (i, data) {
            theSelect += '<option value="' + data.Value + '">' + data.Text + '</option';
        });
        theSelect += "</select>";
    },
    sopt: ['eq', 'ne']
}

удаленный метод GetCustomers возвращает результат json в формате

[{"Selected":false,"Text":"David Gilmour","Value":"10"},
 {"Selected":false,"Text":"Eric Clapton","Value":"26961"},
 {"Selected":false,"Text":"Joan Baetz","Value":"26972"}]

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

alt text


person Lorenzo    schedule 08.12.2010    source источник
comment
Какое значение передается response? Вы можете показать нам, как это выглядит в вашем отладчике?   -  person Kirk Woll    schedule 08.12.2010
comment
там написано [object XMLhttpRequest]   -  person Lorenzo    schedule 08.12.2010


Ответы (5)


Поскольку (согласно вашему комментарию выше) вы получаете объект XMLHttpRequest, вам необходимо проанализировать его текст ответа.

var parsed = $.parseJSON( response.responseText );

$.each( parsed, function(...

Или измените код, который передает ответ, чтобы передать только текст ответа или проанализированный результат.

person user113716    schedule 08.12.2010

ответ - это просто строка, которую нужно проанализировать, используя что-то вроде json2.js

var data = JSON.parse(response);
person NimChimpsky    schedule 08.12.2010

Посмотрите подробный ответ. Мне кажется, вам стоит немного изменить код:

buildSelect: function(data) {
    var response = jQuery.parseJSON(data.responseText);
    var s = '<select>';
    if (response && response.length) {
        for (var i = 0, l=response.length; i<l ; i++) {
            var ri = response[i];
            s += '<option value="' + ri.Value +
                 (ri.Selected ? '" selected="selected">': '">') +
                 ri.Text + '</option>';
        }
   }
   return s + "</select>";
}
person Oleg    schedule 08.12.2010
comment
это много. Это тоже сработает. Проблема заключалась в использовании parseJSON(response.responseText);, как указано @patrick_dw и даже присутствовало в вашем ответе. После этой модификации блок $.each в моем коде работает нормально и стал более компактным. Большое спасибо! - person Lorenzo; 08.12.2010
comment
@Lorenzo: Добро пожаловать! Самое главное, что ваша проблема решена. По правде говоря, я предпочитаю писать ответы на jqgrid, а не на чисто вопросы пользовательского интерфейса jQuery / jQuery, потому что я пишу / печатаю медленно. :-) - person Oleg; 08.12.2010
comment
Я знаю, что Вы имеете ввиду. Для меня вы - максимум ссылок на jqGrid !! :) - person Lorenzo; 09.12.2010

Вы разбираете этот объект JSON, чтобы его можно было прочитать как настоящий объект JS?

Поскольку вы возвращаете массив объектов JSON, вам, возможно, придется анализировать каждый объект индивидуально во время итерации.

person Bryan A    schedule 08.12.2010

Я бы попробовал использовать $(this) внутри каждой функции. Хотя это выглядит правильно, в результате может возникнуть что-то подозрительное. В качестве альтернативы вы можете использовать for (var d in data) (я думаю) для итерации по JSON.

person Brad Christie    schedule 08.12.2010