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

时间:2012-01-31 16:00:08

标签: jqgrid

我正在为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 {}但是无法确切地知道需要在那里设置什么 - 我还没有发现文档有很多帮助

1 个答案:

答案 0 :(得分:5)

我认为对Ajax的使用和从服务器加载网格存在误解。 Ajax在内部使用HTTP协议,将成功的成功响应来自错误响应。如果服务器检测到任何类型的错误,则应设置错误HTTP状态(请参阅herehere)。在 在HTTP状态代码为400及更高的情况下,将调用loadError回调而不是loadComplete。作为成功响应的格式,错误响应的格式绝对是另一种格式。

所以我认为没有理由拥有所有SUCCESSDATAERRORS块。布尔SUCCESS将从上下文中清除:它等于false内的loadError,而true内的loadCompleteRESPONSE.DATA可以直接作为回应的主体。并且RESPONSE.ERRORS可以是错误响应的主体。

这就是为什么loadErrorloadComplete回调都存在的原因。

仅在成功回复的情况下才会调用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,但上述一般模式应该有效。