关于JqGrid流程事件

Fre*_*d A 7 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();
    }
},
Run Code Online (Sandbox Code Playgroud)

和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');
}
Run Code Online (Sandbox Code Playgroud)

至于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
     }
 },
Run Code Online (Sandbox Code Playgroud)

Ole*_*leg 6

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

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

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

现在jQuery,ajax等一下服务器的响应.如果需要,可以更改默认超时值.看到答案.

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

有一些重要的beforeProcessing,其允许回调预处理服务器响应之前它将通过的jqGrid进行处理.可以修改扩展从服务器返回的数据.例如,请参阅答案.此外,jqGrid允许通过beforeProcessing回调来破坏服务器响应的标准处理.如果回调返回,false则jqGrid中断处理并忽略服务器响应.

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

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

在处理完整个服务器响应之后(如果使用loadonce: true选项,这一点尤为重要),jqGridLoadComplete将触发事件,loadComplete调用回调并jqGridAfterLoadComplete触发事件.

我建议你阅读答案,详细描述loadComplete和之间的差异gridComplete.

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

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

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

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