用于userData的jqGrid自定义格式化程序

时间:2011-10-03 16:58:04

标签: jquery jqgrid user-data jqgrid-formatter

是否有任何解决方法可以将自定义'formatter'添加到jqGrid中的userData?我发现this问题,这对我很有帮助。下面是我用来填充jqGrid的代码。请注意,我填充userData中的自定义jsonReader对象并将其设置为loadComplete中的网格我需要在总列中添加单独的'formatter'。如果有办法,请告诉我。提前谢谢。

var userDataTotals;
jq("#testGrid").jqGrid({
    url:'local',
    datatype: 'local',
    mtype: 'GET',
    colNames:[
              'rowId','unitId',
              '<fmt:message key="report.col1"/>',
              '<fmt:message key="report.col2"/>',
    ],
    colModel :[ 
        {name:'rowId', index:'rowId',hidden: true,sortable: true,key:true}, 
        {name:'unitId', index:'unitId',hidden: true,sortable: true,key:true}, 
        {name:'outboundReadyDate', index:'outboundReadyDate', width:80,align:"center",sorttype:'integer',formatter:dateOnlyFmatter,datefmt:'Y M d'},
        {name:'outboundDate', index:'outboundDate', width:80,align:"center",sorttype:'integer',formatter:dateOnlyFmatter,datefmt:'Y M d'},
    ],
    // this will enable the footer row to display totals
    footerrow : true,
    //userDataOnFooter : true,
    altRows : true,
    //to hide pager buttons
    pgbuttons:false,
    recordtext:'',
    pgtext:'',
    gridview: true,
    height:270,
    loadonce: true,
    sortname: 'rowId',
    sortorder: 'asc',
    viewrecords: true,
    rowNum:30000,
    loadComplete: function() {
        // This will increase the column header height ( to show two rows in the header)
        jq(".ui-jqgrid-sortable").css('white-space', 'normal');
        jq(".ui-jqgrid-sortable").css('height', 'auto');
        //Set the total values after load complete,otherwise
        // custom formatter will format the total value as well.

        jq("#mainReportGrid").jqGrid("footerData","set",userDataTotals,false);

        //check the data type to avoid this code to  execute when the pageload
        var checkDatatype = myGrid.jqGrid("getGridParam","datatype");
        if(checkDatatype =='json' && myGrid.getGridParam('records') == 0){
            // when no records are displaying alert it to the user
            alert(noRecordsMsg);
        }

    },

    jsonReader : {
        root: "dtos",
        records: "records",
        repeatitems: false,
        cell: "cell",
        id: "rowId",
        userdata :function(obj) {
            userDataTotals = {"outboundReadyDate":obj.totalOutBounded,
                "outboundDate":obj.totalOutBoundReady};
        }

    },


    //This will format the date of the grid (without displaying time)
    function dateOnlyFmatter (cellvalue, options, rowObject){
        var opts = options.colModel.formatoptions;
        if(cellvalue==null || cellvalue=='undefined'){
            return '-';
        }else{
            if(opts != undefined && rowObject.projectTypeName =='IOD'){
                return 'N/A';   
            }
            var now = new Date(cellvalue);
            return now.format('M j, Y');
        }
    }

我使用自定义dateFormat.js来格式化日期。

和json响应是 -

{
    "dtos": [
        {
            "unitId": 1068,
            "outboundDate": null,
            "outboundReadyDate": 1317619303000,
            "rowId": 13,
        },
        {
            "unitId": 1105,
            "outboundDate": 1317616970000,
            "outboundReadyDate": 1317617213000,
            "rowId": 14,
        }
    ],
    "totalOutBounded": 0,
    "totalOutBoundReady": 4,
    "rowTotal": 15,
    "returnCode": 0,
    "msg": ""
}

我使用sortType作为integer,因为从服务器我将'java'Date对象直接传递给网格。为了对其进行排序,我需要将sortType设置为integer

基本问题我所拥有的是在IE8中我无法看到'userData'总值。但在其他浏览器中,我可以看到它。我需要将userData总值格式化为'超链接'。

没有userData格式我可以在IE8中看到总数。因此,我认为不使用列'formatter'将自定义格式化程序添加到总值(userData)。

1 个答案:

答案 0 :(得分:2)

您有许多小的语法错误:

  • 使用尾随逗号(如',}')是语法错误。您必须从JSON数据以及colNamescolModel中删除尾随逗号。无法读取"rowId": 13,}"rowId": 14,}
  • 您定义jQuery("#testGrid"),但使用jQuery("#mainReportGrid")设置页脚。
  • url: 'local'的情况下,url或任何其他datatype: 'local'参数无意义。在url
  • 的情况下,datatype: 'local'参数将被忽略(未使用)
  • 您使用未在发布的代码中定义的myGrid。您应该在代码的开头某处定义var myGrid = jQuery("#testGrid");,或在var myGrid = $(this);事件处理程序的开头定义loadComplete
  • 您使用now.format('M j, Y')而未发布format的扩展方法Date。您可以改为使用jqGrid方法:return $.fmatter.util.DateFormat(undefined, now, 'M j, Y', $.jgrid.formatter.date);
  • 我建议您始终使用严格等同===而不是==!==而不是!=。请阅读here以获取更多信息。
  • 如果你使用jqGrid 而不使用滚动条,我建议你使用height: 'auto'scrollOffset: 0
  • 我建议你阅读the answer。如果您使用所描述的错误修复,则可以将行jq("#mainReportGrid").jqGrid("footerData","set",userDataTotals,false);修改为行

    myGrid.jqGrid("footerData", "set", myGrid.jqGrid('getGridParam', 'userData'), false);

    不需要变量userDataTotalsuserdata中的方法userdata可以定义为

    userdata: function (obj) { return { outboundReadyDate: obj.totalOutBounded, outboundDate: obj.totalOutBoundReady }; }

您可以看到here修改后的代码版本。