Нет действительно никакой причины сделать параметр, передаваемый по значению "константой", поскольку функция может только изменить копию переменной так или иначе.
причина использовать "константу" состоит в том при передаче чего-то большего (например, структура с большим количеством участников) ссылкой, в этом случае это гарантирует, что функция не может изменить его; или скорее компилятор будет жаловаться, пытаетесь ли Вы изменить его стандартным способом. Это препятствует тому, чтобы он был случайно изменен.
Недавно я широко использовал jqgrid для прототипа проекта, над которым я работаю для CB Richard Ellis (моего работодателя). Есть много способов заполнить jqgrid, как указано в документации : (см. Узел «получение данных»).
В настоящее время я выполняю вызов службы, который возвращает строку json, которая при оценке дает мне объект, содержащий следующее:
В моем успешном обратном вызове я вручную создаю 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, подключенный напрямую к вызову службы или функции для получения данных, тогда это что-то совсем другое.
На странице документации найдите в разделе Основные сетки> События. Там вы увидите "
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
Если вы посмотрите демонстрационный сайт jqgrid и посмотрите «Что нового в версии 3.2», то там должен быть раздел об управлении ошибками сервера.
В частности, это использует параметр обратного вызова loadError:
loadError : function(xhr,st,err) {
jQuery("#rsperror").html("Type: "+st+"; Response: "+ xhr.status + " "+xhr.statusText);
}
Как указано выше в mcv, некоторые ошибки являются ошибками данных, поэтому вам необходимо обрабатывать их специально.
Используйте обратные вызовы. Если вы получаете фактическую ошибку 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);
});
}
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) },
В конце концов, это я думаю, использует тот же подход.
Спасибо всем