关于JqGrid流程事件

时间:2014-06-23 08:01:55

标签: jquery jqgrid

只是想更好地了解JqGrid事件流程

  • beforeRequest
  • loadBeforeSend
  • serializeGridData
  • loadError
  • gridComplete
  • loadComplete

基于此事件

  • 如果我想在ajax请求中向服务器添加过滤器或额外参数,我应该在 loadBeforeSend 中执行此操作吗?
  • 从服务器获取数据后,如果我想阻止数据显示在网格中(我想先进一步处理它,之后只显示处理过的数据),我应该在 gridComplete 对吧?

因为我的工作要求我在向服务器发送请求时添加额外的参数,并且在收到数据后,我需要阻止网格在网格上显示数据,以便我可以在显示数据之前进一步处理数据处理网格上的数据。但是我似乎无法掌握JqGrid应该把我的功能放到哪个事件。

由于


编辑:

对于postData部分

loadBeforeSend: function() {
    if (sessionStorage.pathStates == "edit" && location.pathname.indexOf("list") > -1) {
        console.log("SUCCESS");
        loadFilter();
    }
},

和loadFilter

function loadFilter() {
    var filter = JSON.parse(sessionStorage.filter);
    var filterInput = [],
        model = [],
        filters = {};
    filterInput = filter.filterInput;
    model = filter.model;
    var grid = filter.grid,
        page = filter.page,
        op = "bw",
        a = 0,
        b = 0;

    filters = {
        groupOp: "AND",
        rules: []
    };

    for (var i = 0; i < model.length; i++) {
        if (filterInput[a].length > 0) {
            filters.rules.push({
                field: model[a],
                op: "bw",
                data: filterInput[a]
            });
        }
        a++;
    }

    $(grid).jqGrid('setGridParam', {
        search: true,
        postData: {
            filters: JSON.stringify(filters)
        }
    }).trigger('reloadGrid');
}

对于beforeProcessing,我还不知道这个。但是我心中的过程就是这样的

beforeProcessing: function(data) {
     if (sessionStorage.pathStates == "edit" && location.pathname.indexOf("list") > -1) { >>
         Filter data based on certain criterias, like
         for example, changing one of the column format, or only displaying data that has the value of xxx on certain column >>
             Return the filtered data
     }
 },

1 个答案:

答案 0 :(得分:6)

我觉得你的问题很有意思。我同意jqGrid的当前文档描述了事件和回调的处理不够清楚。因此,我将在答案中首先详细描述处理过程。我将仅考虑您需要的远程datatypedatatype: "json"datatype: xml)的情况。之后我会回复你的具体案例,并为你写下我的建议。

在调用相应的Ajax请求中使用的beforeRequest回调jqGrid构建data参数之前,将其发送到服务器。

  • prmNames选项允许配置标准参数的名称,这些参数将按Ajax发送到服务器。相同的选项prmNames允许通过将相应的值设置为null来删除一些参数。
  • postData选项允许扩展参数,这些参数将发送到服务器。 postData选项的值将在$.extend中使用(请参阅here),以将其他参数与标准参数相结合。 jqGrid使用生成的postData选项作为jQuery.ajaxdata参数的值。 jQuery允许将data用作字符串或具有 functions 属性的对象。在某些情况下,使用函数非常有用:有关详细信息,请参阅the answer
  • jQuery event&#34; jqGridBeforeRequest&#34;将被触发。可以返回"stop" false布尔值的字符串,以停止稍后处理对服务器的请求。可以修改&#34; jqGridBeforeRequest&#34;内的postData参数。事件处理。
  • callback beforeRequest的工作原理与jQuery事件&#34; jqGridBeforeRequest&#34;完全相同,但每个网格只能定义一个回调。回调可以返回false来停止请求。可以使用this来访问网格的参数(请参阅the answer)。
  • 可选的serializeGridData回调是过去控制将发送到服务器的信息的可能性。如果定义了回调serializeGridData,则应返回将发送到服务器的字符串或具有属性或函数的对象。返回的对象将用作jQuery.ajaxdata参数的值。
  • 在处理Ajax请求期间,jQuery可以调用postData中定义的其他函数。另外jQuery会调用loadBeforeSend。例如,可以使用loadBeforeSend回调来修改/扩展Ajax请求的HTTP头。请参阅the answer提供代码示例。可以从false返回loadBeforeSend以强制停止Ajax请求。

现在jQuery,ajax等待服务器的响应。如果需要,可以更改默认超时值。请参阅the answer

如果一个人从服务器获得响应并且响应包含成功HTTP status code(值小于400),则jqGrid将响应解释为成功并以一种方式处理它。失败的回复将以另一种方式处理。

重要的beforeProcessing回调允许预处理服务器响应,之后将由jqGrid处理。可以修改扩展从服务器返回的数据。例如,请参阅the answer。此外,jqGrid允许通过beforeProcessing回调来破坏服务器响应的标准处理。如果回调返回false,则jqGrid会中断处理并忽略服务器响应。

然后jqGrid处理服务器响应。它将被解释为基于jqGrid的JSON选项的XMLdatatype响应。在处理数据期间,在jsonReaderxmlReader内部定义了一些其他回调函数(请参阅here)或在jsonmap / xmlmap中定义(参见{{3可以调用}和here例子。

在处理完可见的数据页面后,将触发jqGridGridComplete事件,将调用gridComplete回调,然后触发jqGridAfterGridComplete

在处理完整个服务器响应后(如果您使用loadonce: true选项,它会特别重要),将触发jqGridLoadComplete事件,将调用loadComplete回调并且<{1}}事件将被触发。

我建议您阅读here,其中详细介绍了jqGridAfterLoadCompleteloadComplete之间的差异。

另一方面,如果服务器响应因超时而失败,或者因为响应包含失败的HTTP状态代码,则不会调用上述回调。而不是只调用gridComplete回调。 the answer详细讨论了回调。我严格建议在使用jqGrid的所有生产代码中定义loadError回调。它应该向服务器显示一些错误消息。

现在我回到你的具体案例。

我建议您在发送请求时使用loadError添加额外参数。您可以直接将所有静态参数定义为属性。您可以将所有动态参数定义为函数。

此外,我建议您使用postData回调。例如,它允许停止网格显示数据。您可以读取和分析从服务器返回的数据。可以轻松修改数据(例如删除一些字段)。