我以这种方式(ajax调用)构建了带有动态列的JQGrid表:

$.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\"'}" );


是否有人面对或知道解决此问题的方法?

预先感谢您的合作

更新

谢谢奥列格。它对于cellattr和模板都非常有用(这是一个非常好的建议)。

对于那些在这里感兴趣的是代码:

var rowSetting = function (rowId, val, rawObject, cm) {
    return 'style="background-color: orange;';
};
var cellattrMapping = {
    "rowTemplate": rowTemplate
};

var rowTemplate = {
    width:120,
    cellattr: rowSetting
};


AJAX通话

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];
         }

最佳答案

看来您执行的操作似乎是将cellattr设置为字符串值cellattr: "rowSetting",而不是将其初始化为函数的指针。问题在于您可以将数据作为JSON发送时存在一些限制。它支持字符串,数字,布尔值,数组和对象,但是您可以将函数作为JSON数据的一部分发送。

可以提出许多解决该问题的方法。例如,您可以使用一些cellattr函数来创建JavaScript代码。您可以将所需的所有cellattr函数放在一个对象中:自定义的cellattr“字符串到函数的映射”。在success回调内部,您可以检查result.colModel项目的cellattr属性。如果找到了cellattr属性,则应将字符串值替换为相应的函数引用。

the old answer中,我描述了更详细的非常接近的解决方案。您可以对cellattr使用相同的方法。

我认为,更好的方法是使用更活跃的templatecolModel属性(请参见the old answer)。您将遇到与以前相同的问题,但是可以提供在不同网格中使用的通用模板,并将第一个字符串值作为template属性的colModel属性值发布。然后,您可以将值替换为包含所有必需的实现详细信息的JavaScript对象。使用列模板的主要优点是可以在多个网格上共享通用代码。 colModel中的信息变得更小且更具可读性。模板可以很容易地修改。

09-25 15:40