Пользовательский форматер jqGrid для userData - PullRequest
0 голосов
/ 03 октября 2011

Есть ли обходной путь для добавления пользовательского «форматера» в userData в jqGrid? я нашел этот вопрос, и он мне очень помогает. ниже приведен код, который я использую для заполнения jqGrid. обратите внимание, что я заполняю пользовательский объект userData в jsonReader и устанавливаю его в сетку в loadComplete. Мне нужно добавить отдельный «форматер» для общего количества столбцов. пожалуйста, дайте мне знать, если есть способ. Заранее спасибо.

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 Ответ

2 голосов
/ 05 октября 2011

У вас много мелких синтаксических ошибок:

  • Использование запятой (например, ',}') является синтаксической ошибкой. Вы должны удалить запятую из данных JSON и из colNames и colModel. "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);.
  • Я рекомендую вам всегда использовать строгое равенство === вместо == и !== вместо !=. Прочитайте, например, здесь для получения дополнительной информации.
  • Я рекомендую вам использовать height: 'auto' или scrollOffset: 0, если вы используете jqGrid без с полосами прокрутки.
  • Рекомендую прочитать ответ . Если вы используете описанное исправление ошибки, вы можете изменить строку jq("#mainReportGrid").jqGrid("footerData","set",userDataTotals,false); на строку

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

    Переменная userDataTotals не понадобится, а метод userdata из userdata можно определить как

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

Вы можете увидеть здесь измененную версию вашего кода.

...