Как я могу заставить JQGrid распознавать сервер, отправленный Ошибки?

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

причина использовать "константу" состоит в том при передаче чего-то большего (например, структура с большим количеством участников) ссылкой, в этом случае это гарантирует, что функция не может изменить его; или скорее компилятор будет жаловаться, пытаетесь ли Вы изменить его стандартным способом. Это препятствует тому, чтобы он был случайно изменен.

22
задан SeanJA 28 October 2009 в 16:37
поделиться

5 ответов

Недавно я широко использовал jqgrid для прототипа проекта, над которым я работаю для CB Richard Ellis (моего работодателя). Есть много способов заполнить jqgrid, как указано в документации : (см. Узел «получение данных»).

В настоящее время я выполняю вызов службы, который возвращает строку json, которая при оценке дает мне объект, содержащий следующее:

  • ColumnNames: string []
  • ColumnModels: object [] (каждый объект имеет свойства «имя», «индекс» и «сортируемый»)
  • Data: object [] (каждый объект имеет свойства, которые соответствуют именам в модели столбца)
  • TotalRows: int

В моем успешном обратном вызове я вручную создаю jqgrid следующим образом: ("данные" - это объект, который я получаю при оценке возвращенного json строка).

var colNames = data.ColumnNames;
var colModel = data.ColumnModels;
var previewData = data.PreviewData;
var totalRows = data.TotalRows;
var sTargetDiv = userContext[0]; // the target div where I'll create my jqgrid

$("#" + sTargetDiv).html("<table cellpadding='0' cellspacing='0'></table>");
var table = $("#" + sTargetDiv + " > table");
table.jqGrid({
    datatype: 'local',
    colNames: colNames,
    colModel: colModel,
    caption: 'Data Preview',
    height: '100%',
    width: 850,
    shrinkToFit: false
});

for (var row = 0; row < previewData.length; ++row)
    table.addRowData(row, previewData[row]);

Итак, как видите, я вручную заполняю данные. Существует более одного вида ошибок сервера. Это логическая ошибка, которую вы можете вернуть как свойство в своей строке json и проверить перед попыткой создания jqgrid (или для каждой строки).

if (data.HasError) ...

Или для каждой строки

for (var row = 0; row < previewData.length; ++row)
{
    if (previewData[row].HasError)
        // Handle error, display error in row, etc
        ...
    else
        table.addRowData(row, previewData[row]);
}

Если ваша ошибка является необработанным исключением на сервере, вам, вероятно, понадобится обратный вызов ошибки в вашем асинхронном вызове. В этом случае ваш успешный обратный вызов, который (предположительно) создает вашу jqgrid, вообще не будет вызываться.

Это, конечно же, относится к ручному заполнению jqgrid, что является лишь одним из многих доступных вариантов. Если у вас есть jqgrid, подключенный напрямую к вызову службы или функции для получения данных, тогда это что-то совсем другое.

На странице документации найдите в разделе Основные сетки> События. Там вы увидите "

7
ответ дан 29 November 2019 в 05:07
поделиться

From what I see, it returns the data as a json string. So what you have to do is add an error handler that formats the error as a json string and prints it out as one. This can be done in php with the

set_error_handler

function.

The error handler would then I guess push the data in to jsonReturn.error, so you would just need to check for that when you are adding your data to the table.

If you are throwing exceptions instead of letting it get all the way to errors (probably a better practice), then you would want to format the exception as a json string.

Since it is returning the data in an xml format, you would want to parse the xml:

<xml>
    <error>
        error message
    </error>
</xml>

like this:

$(request.responseXML).find("error").each(function() {
        var error = $(this);
        //do something with the error
});

Shamelessly borrowed from: http://marcgrabanski.com/article/jquery-makes-parsing-xml-easy

1
ответ дан 29 November 2019 в 05:07
поделиться

Если вы посмотрите демонстрационный сайт jqgrid и посмотрите «Что нового в версии 3.2», то там должен быть раздел об управлении ошибками сервера.

В частности, это использует параметр обратного вызова loadError:

loadError : function(xhr,st,err) { 
    jQuery("#rsperror").html("Type: "+st+"; Response: "+ xhr.status + " "+xhr.statusText);
}

Как указано выше в mcv, некоторые ошибки являются ошибками данных, поэтому вам необходимо обрабатывать их специально.

19
ответ дан 29 November 2019 в 05:07
поделиться

Используйте обратные вызовы. Если вы получаете фактическую ошибку http (например, 400 или 500), запускается loadError (xhr, status, error).

Но некоторые ошибки (например, проверка) не должны вызывать ошибку 400 или 500. Но вы все равно можете поймать их в loadComplete (xhr). Разберите свой json и проверьте, какой способ вы используете для выявления ошибок. Например, я делаю это в моем loadComplete ():

if (jsonResponse.errors) { $ .each (jsonResponse.errors, function (i, val) { addErrorMessage ($ ("#" + val.field), val.message); }); }

3
ответ дан 29 November 2019 в 05:07
поделиться
function gridCroak(postdata, _url, grid, viewCallBack, debug) {
$(".loading").css("display", "block");
$.ajax({
    type: 'POST',
    url: _url,
    data: postdata,
    dataType: "xml",
    complete: function(xmldata, stat){
    if(stat == "success") {
        $(".loading").css("display", "none");
        var errorTag = xmldata.responseXML.getElementsByTagName("error_")[0];
        if (errorTag) {
        $("#ErrorDlg").html(errorTag.firstChild.nodeValue);
        $("#ErrorDlg").dialog('open');
        } else {
        var warningTag = xmldata.responseXML.getElementsByTagName("warning_")[0]; 
        if (warningTag) {
            $("#WarningDlg").html(warningTag.firstChild.nodeValue);
            $("#WarningDlg").dialog('open');
        } else {
            if (debug == true) {
            alert(xmldata.responseText);
            }
            jQuery(grid)[0].addXmlData(xmldata.responseXML);
            if(viewCallBack) viewCallBack();
        }
        }
    } else {
        $("#ErrorDlg").html("Servizio Attualmente Non Disponibile !");
        $("#ErrorDlg").dialog('open');
    }
    }
});
}

И в таблице

datatype : function(postdata) { gridCroak(postdata, 'cgi-bin/dummy.pl?query=stock', 
                                                    "#list", null, false) },

В конце концов, это я думаю, использует тот же подход.

Спасибо всем

0
ответ дан 29 November 2019 в 05:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: