2013-05-03 80 views
1

我建立了我的動態列的jqGrid表以這種方式(AJAX調用):jqGrid的動態柱:cellattr不起作用

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

,它工作正常:)

當我創建就像使用cellattr

$response->colModel[$colMod++] = array ('name'=>'DIR'.$projectName, 'index'=>'DIR'.$projectName, 'width'=>'40', "cellattr"=>"rowSetting"); 

在PHP文件欄是絕對沒有任何影響。 即使我直接在cellattr把這樣的代碼

"cellattr"=>"function(rowId, value, rowObject, colModel, arrData) { return ' style=\"background:orange\"'}"); 

有誰曾經面臨或知道解決這個問題?

預先感謝您的合作

UPDATE

感謝奧列格。它對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]; 
     } 

回答

1

看來,你做了什麼樣子你設置cellattr字符串值cellattr: "rowSetting"代替將它初始化爲函數的指針。問題是您可以作爲JSON發送的數據有一些限制。它支持字符串,數字,布爾值,數組和對象,但是可以將函數作爲JSON數據的一部分發送。

可以爲此問題提出許多解決方法。例如,您可以使用您使用的某些cellattr函數創建JavaScript代碼。您可以將所需的所有cellattr函數放在一個對象中:您的自定義cellattr「字符串到函數映射」。在success回調裏面,你可以檢查result.colModel物品的cellattr屬性。如果您發現cellattr屬性,則應該將字符串值替換爲相應的函數引用。

the old answer我描述了更詳細的非常接近的解決方案。您可以使用cellattr的相同方法。

在我看來更好的方法是使用屬性colModel更活躍(見the old answer)。您將遇到與以前相同的問題,但您可以提供在不同網格中使用的常用模板,並將第一個字符串值作爲colModeltemplate屬性的值發佈。然後,您可以將該值替換爲包含所有必需實現細節的JavaScript對象。使用列模板的主要優點是在多個網格上共享通用代碼。 colModel中的信息變得更小,更具可讀性。模板可以很容易地修改。