一个应该使用beforeProcessing
代替loadComplete
对从服务器加载的数据进行一些修改。回调非常实用loadonce: true
场景,因为从服务器加载数据后只会调用一次。
理解这一点非常重要,即应该尝试减少更改的数量在 HTML 页面的 DOM 上。如果您在 HTML 解析器处理之前更改数据,那么它的工作速度非常快:您更改一个属性,并且只有该属性会被更改。另一方面,在重新计算之后更改 HTML 页面上的一个元素,并且可能会更改all页面上存在的其他元素。例如,您在网格上插入一个元素。然后网格的位置(以及网格的所有其他元素)将发生变化。至少网络浏览器必须验证是否进行了某些更改all所需的现有元素。它是浏览器回流 https://developers.google.com/speed/articles/reflow。如果您在循环中更改 HTML 元素(例如调用setRowData
代替loadComplete
)那么它实质上降低了 HTML 页面的速度。
再说一点。我建议您使用 JSFiddle 的 Echo 服务(请参阅here http://doc.jsfiddle.net/use/echo.html)来模拟从服务器加载数据。相应的代码可能如下:
var i, data = [], grid = $('#grid');
for(i=0; i<4; i++) {
data.push({id:i, select1: i%3});
}
grid.jqGrid({
datatype: "json",
mtype: "POST",
url: "/echo/json/",
postData: {
json: JSON.stringify(data)
},
loadonce: true,
forceClientSorting: true,
caption: 'Testing',
editurl: 'clientArray',
rowNum: 2,
rowList: [2, 4],
pager: true,
colModel: [
{name:'select1', label: 'Server status', editable:true, edittype:'select', formatter:'select', template: "integer", editoptions:{
value:'0:AAA;1:BBB;2:CCC'
}},
{name:'select2', label: 'Local status', editable: true, edittype: 'select', formatter:'select', editoptions:{
value:'0:AAA;1:BBB;2:CCC'
}},
{name:'act', template:'actions'}
],
inlineEditing: {
keys: true
},
beforeProcessing: function(data){
var i;
for(i=0; i<data.length; i++){
data[i].select2 = 0;
}
}
});
$('#b1').click(function(){
$('#out').empty()
var i, gridData = grid.jqGrid('getGridParam','data');
for(i=0; i<gridData.length; i++){
out(JSON.stringify(gridData[i]));
}
});
function out(message){
$('#out').append('<p>' + message +'</p>');
}
查看修改后的演示https://jsfiddle.net/OlegKi/c09fnaca/8/ https://jsfiddle.net/OlegKi/c09fnaca/8/。我添加了template: "integer"
第一列中仅用于演示数据到数字的转换。免费 jqGrid 支持convertOnSave
回调(参见维基文章 https://github.com/free-jqgrid/jqGrid/wiki/Editing-of-local-data#the-main-idea-of-the-implementation),这有助于进行某种转换保存期间本地数据。例如定义以下回调(参见线条 https://github.com/free-jqgrid/jqGrid/blob/v4.14.1/js/jquery.fmatter.js#L169-L172的代码)
convertOnSave: function (options) {
var nData = options.newValue;
return isNaN(nData) ? nData : parseInt(nData, 10);
}
结果,第一列中使用的数据将转换为数字,而不是将数据保存为字符串。