我用这种方式用动态列构建了我的JQGrid表(ajax调用):
$.ajax(
{
type: "POST",
url: "Scripts/GetSummaryInformation.php",
data: { domain: "<?php echo $domain; ?>", etc. },
dataType: "json",
success: function(result)
{
var colD = result.gridModel;
var colN = result.colNames;
var colM = result.colModel;
var colSpan = result.colSpan;
jQuery("#FinalRatingList<?php echo $domain; ?><?php echo $companyID; ?>").jqGrid({
jsonReader : { repeatitems: false, root:"dataset", cell: "cell", id: "0" },
url: 'Scripts/GetSummaryInformation.php',
datatype: 'json',
mtype: 'POST',
postData : { domain: "<?php echo $domain; ?>", etc.},
datastr : colD,
colNames:colN,
colModel :colM,
height: 'auto',
pager: jQuery('#FinalRatingListPager'),
caption:"Final Rating",
loadComplete: function(data){
console.info("FinalRatingList Success");
notyMsg ("loadComplete", "info");
},
...
并且工作正常:)
当我在PHP文件中创建一个列时,比如使用 cellattr
$response->colModel[$colMod++] = array ('name'=>'DIR'.$projectName, 'index'=>'DIR'.$projectName, 'width'=>'40', "cellattr"=>"rowSetting" );
完全没有效果。 即使我把代码直接放在像这样的cellattr
"cellattr"=>"function( rowId, value, rowObject, colModel, arrData) { return ' style=\"background:orange\"'}" );
有没有人面对或知道这个问题的解决方案?
提前感谢您的合作
更新
感谢Oleg。它对cellattr和模板起了很大作用(这是一个非常好的建议)。
对于那些感兴趣的人是代码:
var rowSetting = function (rowId, val, rawObject, cm) {
return 'style="background-color: orange;';
};
var cellattrMapping = {
"rowTemplate": rowTemplate
};
var rowTemplate = {
width:120,
cellattr: rowSetting
};
AJAX CALL
success: function(result)
{
...
for (i=0; i<colM.length; i++) {
cm = colM[i];
if (cm.hasOwnProperty("template") && cellattrMapping.hasOwnProperty(cm.template))
{
cm.template = cellattrMapping[cm.template];
}
答案 0 :(得分:1)
您执行的操作似乎是将cellattr
设置为字符串值 cellattr: "rowSetting"
,而不是将其初始化为函数指针。问题是您可以作为JSON发送的数据存在一些限制。它支持字符串,数字,布尔值,数组和对象,但您可以将函数作为JSON数据的一部分发送。
可以为问题提出许多解决方法。例如,您可以使用您使用的一些cellattr
函数创建JavaScript代码。您可以将所需的所有cellattr
函数放在一个对象中:自定义cellattr
“字符串到函数映射”。在success
回调内,您可以检查result.colModel
属性的cellattr
项。如果找到cellattr
属性,则应将字符串值替换为相应的函数引用。
在the old answer我描述了更详细的非常接近的解决方案。您可以对cellattr
使用相同的方法。
我认为更好的方法是使用template
更加活跃的colModel
属性(请参阅the old answer)。您将遇到与以前相同的问题,但您可以提供在不同网格中使用的常用模板,并将第一个字符串值作为template
colModel
属性的值发布。然后,您可以将值替换为包含所有必需实现详细信息的JavaScript对象。使用列模板的主要优点是在多个网格上共享公共代码。 colModel
中的信息变得更小,更易读。模板可以很容易修改。