【问题标题】:About the JqGrid process events关于 JqGrid 流程事件
【发布时间】:2014-08-13 04:55:27
【问题描述】:

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

  • 请求前
  • loadBeforeSend
  • serializeGridData
  • 加载错误
  • gridComplete
  • 加载完成

基于此事件

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

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

谢谢


编辑:

对于 postData 部分

loadBeforeSend: function() {
    if (sessionStorage.pathStates == "edit" && location.pathname.indexOf("list") > -1) {
        console.log("SUCCESS");
        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
     }
 },

【问题讨论】:

    标签: jquery jqgrid


    【解决方案1】:

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

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

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

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

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

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

    然后 jqGrid 处理服务器响应。基于 jqGrid 的 datatype 选项,它将被解释为 JSONXML 响应。在处理数据期间,可以调用在jsonReaderxmlReader(参见here)或在jsonmap/xmlmap(参见herehere 示例)中定义的一些其他回调函数。

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

    整个服务器响应处理完毕后(如果使用loadonce: true 选项尤其重要),然后会触发jqGridLoadComplete 事件,将调用loadComplete 回调并触发jqGridAfterLoadComplete 事件。

    我建议您阅读the answer,其中详细描述了loadCompletegridComplete 之间的区别。

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

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

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

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

    【讨论】:

    • 很好的解释!
    • 正是一个了不起的精彩解释。非常感谢 Oleg :) 所以从你描述的方式来看,postData 应该在 loadBeforeSend 中定义,而要处理服务器响应,在 beforeProcessing 中进行,对吗?
    • @FredA:不客气! postData 只是一个选项,您可以在创建网格时直接定义它。 loadBeforeSend 在你的情况下似乎不需要我。回调beforeProcessing 可用于在 jqGrid 处理之前修改服务器响应。
    • 我刚刚在loadBeforeSend上尝试了postData,JqGrid发送了2个请求(在网络下的inspector中检查),一个来自postData的过滤器,另一个是拉取所有数据的正常请求.似乎我在使用 postData 时做得对,但没想到 jqGrid 会再次发送请求。我做错什么了吗? (设置 postData 后,我再次将其设置为 reloadGrid。这是在请求中插入过滤器的正确方法吗?)
    • @FredA:最好在问题的文本后面加上你现在使用的代码。我想你根本不应该不使用 loadBeforeSend
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多