我正在按照Ben Nadel的模型为远程cfc方法实现统一的错误处理程序.在达到这一点之前,我只是以预期的形式将数据对象返回到jqGrid.现在,我正在返回一个看起来像这样的响应对象:
RESPONSE.SUCCESS = "true/false"
RESPONSE.ERRORS = [array of errors]
RESPONSE.DATA = {normal data object that jqGrid expects}
Run Code Online (Sandbox Code Playgroud)
所以,我现在需要在返回时按摩响应对象,以便我有一个
RESPONSE.SUCCESS == "true"
Run Code Online (Sandbox Code Playgroud)
处理程序,至少将RESPONSE.DATA映射到jqGrid期望的数据对象,还有一个
RESPONSE.SUCCESS == "false"
Run Code Online (Sandbox Code Playgroud)
做其他事情的处理程序.我的第一个想法是尝试实现beforeProcessing选项.但是,如果我将其添加到我的初始化代码中:
beforeProcessing: function(data, status, xhr) {
console.log(data + ' beforeProcessing was called');
},...
Run Code Online (Sandbox Code Playgroud)
在初始化或后续调用中都没有记录任何内容.此外,如果我恢复原始代码并成功重新加载网格,那么内部就无法运行
beforeProcessing: function(){
alert('hi');
console.log('hi there');
},...
Run Code Online (Sandbox Code Playgroud)
这似乎表明beforeProcessing被打破了.
如果我不能让它工作,我将尝试实现ajaxGridOptions {},但无法确切地知道需要在那里设置什么 - 我没有找到文档提供很多帮助.
我认为对Ajax的使用和从服务器加载网格存在误解.Ajax在内部使用HTTP协议,从错误响应中划分清除成功响应.如果服务器检测到任何类型的错误,则应设置错误HTTP状态(请参阅此处或此处).如果HTTP状态代码为400或更高,则将调用回调而不是.作为成功响应的格式,错误响应的格式绝对是另一种格式.loadErrorloadComplete
所以我认为没有理由拥有所有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');获取的信息得到的文本不多.
更新:我不知道ColdFusion及其在错误处理方面的限制.如果你真的只能在成功的情况下返回数据
{
"SUCCESS": true,
"ERRORS": [],
"DATA": {
"TOTAL": xxx,
"PAGE": "yyy",
"RECORDS": "zzz",
"ROWS": [
{"ID": "id1", "CELL": ["cell11", "cell12", "cell13"]},
{"ID": "id2", "CELL": ["cell21", "cell22", "cell23"]},
...
]
}
}
Run Code Online (Sandbox Code Playgroud)
并在出现错误的情况下
{
"SUCCESS": true,
"ERRORS": ["Any error description"],
"DATA": {
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以做到以下几点.
首先,您应该定义jqGrid的jsonReader选项,该选项对应于成功的数据:
jsonReader: {
root: "DATA.ROWS",
page: "DATA.PAGE",
total: "DATA.TOTAL",
records: "DATA.RECORDS",
id: "ID"
}
Run Code Online (Sandbox Code Playgroud)
为了能够读取错误响应,您可以"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(','));
}
}
Run Code Online (Sandbox Code Playgroud)
在现实世界中,您应该data.ERRORS在某些div或对话框中显示错误消息而不是使用alert,但上面描述的一般模式应该有效.