在使用jqgrid的过程中遇到了了很多问题,将主要问题分享一下
1、引入的jquery版本冲突问题
当时项目中已经引入了jquery的一个高版本,放在一个基本文件中引用,而我的页面引用了这个基本文件,但是我下载的jqgrid的jquery版本是1.7的,引入之后,前端一直报错说“找不到jquery的定义, jQuery("#scheduleTable").jqGrid不是function”之类的错,一开始我并不清楚那个基本文件中也引入了jquery,以为是引入顺序出错,或者jquery版本出错,一直不停换顺序,换版本,调试了很久,发现这个问题之后,我将基本文件中我需要引入的文件复制到我的页面引入,同时也刻意注意了引入的顺序,刷新之后,果然解决了。
2、发送请求,出现BadRequest错误
网上很多资料说是后台的实体类bean与前台传来的数据类型不匹配
后台我用的是SpringMVC的@requestBody接收参数,我的解决过程如下:
(1)将后台实体Bean的每个属性类型改为String,但是不成功;
(2)资料说“前台传参时参数的顺序与后台实体类的各个属性的顺序不一致”也是原因,于是将顺序改为一致,问题仍然存在;
(3)“如果是传了非实体bean属性的参数过来也会发生这种情况”,jqgrid在发送请求时除了传自定义的参数,还传来了“page”,"rows"等参数,于是我在实体Bean中加入了这些字段,前台没有报错,但是后台断点看不到传来的值;(这是什么原因暂时还没有解决,如果各位知道原因请留言,共享资源);
(4)最后决定将@requestBody换成@requetParam,一个参数一个参数来接收,这时候,后台看到了传过来的值。
一位大我一届的师兄也是我导师看到第三个问题的时候,他告诉我需要将前台的参数封装成一个对象,传到后台@requestBody才会接收,当第4步成功的时候,我大概也猜到了这个原因,但是我的确是封装成了一个对象:
var postData={//父表参数
projectName:$scope.projectName,
subSystem:$scope.subSystem,
module:$scope.module,
father_son:father_son
};
只不过当时我忘记了,jqgrid自带的参数并没有被封装。(这是个人猜想,因为时间原因,我必须返校做毕业设计,这个问题还没有来得及测试检验)3、后台数据正确传到了前端,可是表格数据就是不显示
这个问题应该是使用过jqgrid的基本都会碰到,网上有很多种说法,因为后台传送的json数据格式不对,因为jqgrid对json的数据格式非常严格。
SpringMVC使用@responseBody返回的数据其实就是json格式的,只是,jqgrid有它自己的格式,我设置的jsonReader如下:
jsonReader : {
root:"rows",
page:"page",
total:"total",
records:"records",
repeatitems:false,
id:"0",
},
那么对应的格式是这样:{
"page": "1",
"total": "13",
"records": "13",
"rows": [
{
"pageNumber": 0,
"pageSize": 0,
"remark": null,
"projectName": "哈哈哈",
"subSystem": "sub1",
"module": null,
"category": "number1"
},
{
"pageNumber": 0,
"pageSize": 0,
"remark": null,
"projectName": "哈哈哈1",
"subSystem": "sub2",
"module": null,
"category": "number2",
}
]
}
所以在后台,需要将
"page": "1",
"total": "13",
"records": "13",
这些参数进行拼接,“rows”{}中的内容放在一个List中,最外面的{}是一个对象,这个对象中定义了“rows”{}这个List。返回这个对象即可。
这个地方我犯了一个错,把最外层{}的对象也放进了一个List,循环set,结果造成json数据中“rows”{}中的每个对象也包含了"page": "1", "total": "13", "records": "13"这些参数,所以一直显示不出来。
还有一些注意的点
jqgrid高一点的版本中
colModel: [
{name:"projectName",index:"projectName",width:80,key:true},
{name:"subSystem",index:"subSystem",width:130}
]中name的值需要用“”引起来,不能用''。