任何人都对jqGrid的beforeProcessing选项有运气吗?

ear*_*efl 2 jqgrid

我正在按照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 {},但无法确切地知道需要在那里设置什么 - 我没有找到文档提供很多帮助.

Ole*_*leg 5

我认为对Ajax的使用和从服务器加载网格存在误解.Ajax在内部使用HTTP协议,从错误响应中划分清除成功响应.如果服务器检测到任何类型的错误,则应设置错误HTTP状态(请参阅此处此处).如果HTTP状态代码为400或更高,则将调用回调而不是.作为成功响应的格式,错误响应的格式绝对是另一种格式.loadErrorloadComplete

所以我认为没有理由拥有所有SUCCESS,DATAERRORS阻止.布尔SUCCESS将从上下文中清楚:它等于false内部,loadError而它是true内部的loadComplete.RESPONSE.DATA可以直接反应的身体.并且RESPONSE.ERRORS可以是错误响应的主体.

这就是为什么两者loadErrorloadComplete回调都存在的原因.

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,但上面描述的一般模式应该有效.