我正在使用Guriddo jqGrid 5.2.1。我已经定义了jsonReader
来处理网址返回的非标准数据格式:
jsonReader : {
root:"payload.rows",
page: "payload.page", // the current page
total: "payload.total", // the total # of pages
records: "payload.records" // the total # of records
},
网格也将loadonce
设置为true
,以便所有数据都加载一次。这使我可以让网格处理排序而不是从服务器请求排序数据。行中的一个输入字段是以毫秒表示的日期。我定义了一个beforeProcessing
函数来处理将每行中的日期转换为可以正确格式化的值:
beforeProcessing: function (data) {
for(var i = 0; i < data.payload.rows.length; i++) {
var d = new Date(data.payload.rows[i].ihw);
data.payload.rows[i].ihw = d;
}
},
最初检索数据时,此工作正常。但是,我注意到,即使beforeProcessing
设置为loadonce
,每当我点击要排序的列时都会调用true
。我可以更改代码以使用this post中的formatter
处理日期格式。但是,我有其他数据操作需求,例如,我想在每行中添加一个新字段,该行是该行中其他三个字段的串联。使用jsonReader
时,传入的数据似乎会转换为标准的jqgrid格式,以便下次beforeProcessing
执行时(例如排序),beforeProcessing
代码错误,因为数据现在的格式与以前不同。在最初从服务器检索数据后,是否有一个我只能运行一次的事件?或者我是否需要在beforeProcessing
中设置一个JavaScrpt变量,该变量指示数据已处理一次,并在后续调用中跳过处理?
答案 0 :(得分:0)
当数据类型是本地时,旧代码不考虑beforeProcessing事件 - 这是修复此错误并将beforeProcessing添加到所有数据类型的原因。
由于选项 loadonce 设置为true,因此您将数据类型从json更改为local,但是如前所述,beforeProcessing将传递不同的数据。
一种可能的解决方案是设置一个标志只执行一次该代码或在事件中将同一事件设置为null
beforeProcessing: function (data) {
for(var i = 0; i < data.payload.rows.length; i++) {
var d = new Date(data.payload.rows[i].ihw);
data.payload.rows[i].ihw = d;
}
this.p.beforeProcessing = null;
},