jqGrid - перезагрузить подсеть, если изменилась страница родительской сетки? - PullRequest
2 голосов
/ 12 января 2012

У меня есть простая подсетка в виде сетки, и у родительского склада более 1 страницы.

следующий код для тестирования:

<!doctype html>
<html>
<head>
    <link rel="stylesheet" type="text/css" href="css/style.css"/>
    <link rel="stylesheet" type="text/css" href="css/ui-lightness/jquery-ui-1.8.16.custom.css"/>
    <link rel="stylesheet" type="text/css" media="screen" href="css/ui.jqgrid.css" />

    <script type="text/javascript" src="js/jquery.js"></script>
    <script type="text/javascript" src="js/jquery-ui.js"></script>
    <script type="text/javascript" src="js/grid.locale-en.js" ></script>
    <script type="text/javascript" src="js/jquery.jqGrid.min.js" ></script>     
</head>
<body>
    <table id="grid1">
    <div id="pager1"></div>
    </table>

    <script type="text/javascript">     
        jQuery("#grid1").jqGrid({ 
        datatype: "local", 
        height: 250, 
        rowNum:5, 
        rowList:[5,10,15],
        cellEdit:true,
        cellsubmit: 'clientArray',
        pager: '#pager1',
        colNames:['Inv No', 'Client','Notes','Checked?' ], 
        colModel:[ 
        {name:'id',index:'id', width:60, sortable:false}, 
        {name:'name',index:'name', width:100, sortable:false}, 
        {name:'note',index:'note', width:150, sortable:false, editable:true}, 
        {name:'ind_checked',index:'ind_checked', width:100, sortable:false, align:'center', editable:true, 
            edittype:'checkbox', editoptions: { value:"Yes:No" },  formatter:'checkbox'}
        ],
        caption: "Testing",
        loadonce: true,
        subGrid : true, 
        subGridOptions: { reloadOnExpand : false},
        subGridRowExpanded: function(subgrid_id, parent_rowid) {
            subgrid_table_id = subgrid_id+"_t";
            subgrid_pager_id = 'p_'+subgrid_table_id;
            jQuery("#"+subgrid_id).html("<table id='"+subgrid_table_id+"'></table><div id='" + subgrid_pager_id + "'></div>");
            jQuery("#"+subgrid_table_id).jqGrid({
                datatype: "local", 
                height: "100%", 
                cellEdit:true,
                cellsubmit: 'clientArray',
                pager: '#'+subgrid_pager_id,
                colNames:['Inv No','Item No', 'Qty'], 
                colModel:[ 
                    {name:'id',index:'id', width:60, sortable:false},
                    {name:'icode',index:'icode', width:60, sortable:false}, 
                    {name:'qty',index:'qty', width:100, sortable:false, editable:true}
                ],
                loadonce: true,
                loadComplete : function() {
                    var dataIds = $('#grid1').jqGrid('getDataIDs');
                    var data = $('#grid1').jqGrid('getRowData',dataIds[parent_rowid-1]);
                    loadDetail(data.id);
                }
            });
        }
        }).navGrid('#pager1');

        var mydata = [ 
        {id:"1",name:"test1",note:"note1",ind_checked:"yes"}, 
        {id:"2",name:"test2",note:"note2",ind_checked:"no"}, 
        {id:"3",name:"test3",note:"note3",ind_checked:"yes"}, 
        {id:"4",name:"test4",note:"note4",ind_checked:"yes"}, 
        {id:"5",name:"test5",note:"note5",ind_checked:"no"}, 
        {id:"6",name:"test6",note:"note6",ind_checked:"no"}, 
        {id:"7",name:"test7",note:"note7",ind_checked:"yes"}, 
        {id:"8",name:"test8",note:"note8",ind_checked:"no"}, 
        {id:"9",name:"test9",note:"note9",ind_checked:"no"} ]
        ;

        for(var i=0;i<mydata.length;i++) {
            jQuery("#grid1").jqGrid('addRowData',i+1,mydata[i]);
        }

        var mySGdata = [ 
        {id:"1",icode:"item1",qty:10}, 
        {id:"1",icode:"item2",qty:10}, 
        {id:"3",icode:"item1",qty:10}, 
        {id:"3",icode:"item2",qty:10}, 
        {id:"3",icode:"item3",qty:10}, 
        {id:"4",icode:"item2",qty:10}, 
        {id:"7",icode:"item1",qty:10}, 
        {id:"7",icode:"item3",qty:10}, 
        {id:"9",icode:"item3",qty:10} ]
        ; 

        function loadDetail(id) {
            for (var i=0; i<mySGdata.length; i++) {
                if (mySGdata[i].id==id) {
                    //alert('Add subgridRow');
                    jQuery("#"+subgrid_table_id).jqGrid('addRowData',i+1,mySGdata[i]);
                }
            }
        }
    </script>
</body>
</html>

Проблема в том, что подсетка перезагрузит локальные данные, если родительская сетка изменила страницу, даже если я добавил параметры subGridOptions: {reloadOnExpand: false} и loadonce: ture

Допустим, вы можете изменить QTY в подсетке, а затем свернуть и развернуть ее.Подсетка не будет перезагружать локальные данные и все еще сохранила мои изменения.

Однако, если я перейду на следующую страницу и вернусь на предыдущую страницу, подсетка снова перезагрузит локальные данные, когда я разверну их.Итак, я потерял все свои изменения.

У кого-нибудь есть идеи и обходные пути, или что-то, чего мне не хватает?пожалуйста, посоветуй мне.Спасибо.

Чтобы протестировать мой скрипт, пожалуйста, щелкните по rowList и сделайте так, чтобы сетка содержала сначала 5 строк и имела 2 страницы, потому что я не знаю, как сделать страницу / контейнер для отображения 5 строк всамый первый, начиная с локальных данных.Если кто-нибудь знает, как это сделать, это тоже будет для меня бонусом.Спасибо!

Обновлено: Я понял, что дело не только в том, что страница была изменена, она также вызывает перезагрузку подсетки при изменении rowList (сколько строк отображается на странице).Есть ли способ избежать такого поведения?Пожалуйста.Спасибо

1 Ответ

2 голосов
/ 12 января 2012

Сначала я бы сначала создал массивы данных и установил их непосредственно в параметрах сетки (как в в этом примере ).Тогда количество строк в порядке, и дополнительный загрузочный код javascript для загрузки не требуется.

В противном случае необходимо перезагрузить сетку, чтобы после добавления данных было правильно указано количество строк:

jQuery("#grid1").trigger("reloadGrid");

Также посмотрите этот пример перезагрузки .


К вашему основному вопросу: опция loadonce и пейджер не работают вместе (см. эта ссылка ).

Обходной путь: я думаю, что вам нужно менять переменные данных после каждого изменения данных или перед каждой подкачкой страниц (например, вы можете использовать onPaging -event).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...