> 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 } },
解决方法
在调用beforeRequest之前,回调jqGrid构建数据参数,使用相应的Ajax请求将其发送到服务器.
> prmNames选项允许配置将按Ajax发送到服务器的标准参数的名称.相同的选项prmNames允许通过将相应的值设置为null来删除一些参数.
> postData选项允许扩展将发送到服务器的参数. postData选项的值将在$.extend中使用(参见here),以将其他参数与标准参数组合在一起. jqGrid使用生成的postData选项作为jQuery.ajax的data参数的值.jQuery允许将数据用作字符串或具有函数属性的对象.在某些情况下,使用函数非常有用:有关详细信息,请参阅the answer.
>将触发jQuery事件“jqGridBeforeRequest”.可以返回“停止”字符串的假布尔值,以停止稍后处理对服务器的请求.可以修改“jqGridBeforeRequest”事件句柄中的postData参数.
> callback beforeRequest的工作方式与jQuery事件“jqGridBeforeRequest”完全相同,但每个网格只能定义一个回调.回调可以返回false以停止请求.可以使用它来访问网格的参数(参见the answer).
>可选的serializeGridData回调是过去控制将发送到服务器的信息的可能性.如果定义了回调serializeGridData,它应返回将发送到服务器的字符串或具有属性或函数的对象.返回的对象将用作jQuery.ajax的数据参数的值.
>在处理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的数据类型选项的JSON或XML响应.在处理数据期间,可以调用jsonReader或xmlReader(参见here)中定义的或jsonmap / xmlmap中定义的一些其他回调函数(参见here和here示例).
处理完可见页面数据后,将触发jqGridGridComplete事件,将调用gridComplete回调,然后触发jqGridAfterGridComplete.
在处理整个服务器响应之后(如果使用loadonce:true选项,这一点尤其重要),将触发jqGridLoadComplete事件,将调用loadComplete回调并触发jqGridAfterLoadComplete事件.
我建议你阅读the answer,其中详细描述了loadComplete和gridComplete之间的区别.
另一方面,如果服务器响应因超时而失败,或者因为响应包含失败的HTTP状态代码,则不会调用上述回调.而不是只调用loadError回调. The answer详细讨论了回调.我严格建议在使用jqGrid的所有生产代码中使用defineload错误回调.它应该向服务器显示一些错误消息.
现在我回到你的具体案例.
我建议你在发送请求时使用postData添加额外的参数.您可以直接将所有静态参数定义为属性.您可以将所有动态参数定义为函数.
另外我建议你使用beforeProcessing回调.例如,它允许停止网格显示数据.您可以读取和分析从服务器返回的数据.可以轻松修改数据(例如删除一些字段).