我正在为Ben Nadel的model之后的远程cfc方法实现统一的错误处理程序。在达到这一点之前,我只是以预期的形式将数据对象返回到jqGrid。现在,我正在返回一个看起来像这样的响应对象:
RESPONSE.SUCCESS = "true/false"
RESPONSE.ERRORS = [array of errors]
RESPONSE.DATA = {normal data object that jqGrid expects}
所以,我现在需要在返回时按下响应对象,以便我有一个
RESPONSE.SUCCESS == "true"
处理程序,至少将RESPONSE.DATA映射到jqGrid期望的数据对象,还有
RESPONSE.SUCCESS == "false"
执行其他操作的处理程序。我的第一个想法是尝试实现beforeProcessing选项。但是,如果我将其添加到我的初始化代码中:
beforeProcessing: function(data, status, xhr) {
console.log(data + ' beforeProcessing was called');
},...
在初始化或后续调用中都没有记录任何内容。此外,如果我恢复原始代码并成功重新加载网格,则无法在
内部运行beforeProcessing: function(){
alert('hi');
console.log('hi there');
},...
这似乎表明beforeProcessing已经崩溃。
如果我不能让它工作,我将尝试实现ajaxGridOptions {}但是无法确切地知道需要在那里设置什么 - 我还没有发现文档有很多帮助
答案 0 :(得分:5)
我认为对Ajax的使用和从服务器加载网格存在误解。 Ajax在内部使用HTTP协议,将成功的成功响应来自错误响应。如果服务器检测到任何类型的错误,则应设置错误HTTP状态(请参阅here或here)。在
在HTTP状态代码为400及更高的情况下,将调用loadError
回调而不是loadComplete
。作为成功响应的格式,错误响应的格式绝对是另一种格式。
所以我认为没有理由拥有所有SUCCESS
,DATA
和ERRORS
块。布尔SUCCESS
将从上下文中清除:它等于false
内的loadError
,而true
内的loadComplete
。 RESPONSE.DATA
可以直接作为回应的主体。并且RESPONSE.ERRORS
可以是错误响应的主体。
这就是为什么loadError
和loadComplete
回调都存在的原因。
仅在成功回复的情况下才会调用beforeProcessing
。语句console.log(data);
不会显示所需信息,因为data
将是对象,LOG: [object Object] beforeProcessing was called
生成的console.log(data + ' beforeProcessing was called');
等文本将获取的信息不多。
UPDATED :我不知道ColdFusion及其在错误处理方面的限制。如果你真的只能在成功的情况下返回数据,如
{
"SUCCESS": true,
"ERRORS": [],
"DATA": {
"TOTAL": xxx,
"PAGE": "yyy",
"RECORDS": "zzz",
"ROWS": [
{"ID": "id1", "CELL": ["cell11", "cell12", "cell13"]},
{"ID": "id2", "CELL": ["cell21", "cell22", "cell23"]},
...
]
}
}
并且出现错误
{
"SUCCESS": true,
"ERRORS": ["Any error description"],
"DATA": {
}
}
然后您可以执行以下操作。
首先,您应该定义jqGrid的jsonReader选项,该选项对应于成功的数据:
jsonReader: {
root: "DATA.ROWS",
page: "DATA.PAGE",
total: "DATA.TOTAL",
records: "DATA.RECORDS",
id: "ID"
}
为了能够阅读错误回复,您可以在"DATA"
内的响应中放置空beforeProcessing
部分:
beforeProcessing: function (data) {
if (!data.SUCCESS) {
// error response. we set empty "DATA"
data.DATA = {TOTAL: 0, PAGE: 0, ROWS: []};
// now the data.ERRORS should be processed
alert (data.ERRORS.join(','));
}
}
在现实世界中,您应该在某些div或对话框中显示来自data.ERRORS
的错误消息,而不是使用alert
,但上述一般模式应该有效。