2

如果页码高于 loadComplete 事件中的总页数,我希望能够重新加载 jqgrid。我正在将网格设置保存到浏览器本地存储中,如本答案 - Persisting jqGrid column preferences

我添加了一个调用来触发网格的重新加载并将页面设置回 1,但它似乎在 loadComplete 方法中不起作用。我已经调试了代码并调用了该方法。

Javascript:(重要的部分是 jqGrid 定义中的 loadComplete 函数)

$(document).ready(function() {          
    var $grid = $('#grid'),
    cm = [ 
        { name: 'Id', index: 'Id', width: 120, align: 'left', editable: false,sortable: true,hidden: true,hidedlg: true,Key: true}, 
        { name: 'Status', index: 'Status', width: 80, align: 'left', editable: false,sortable: true,hidden: true,hidedlg: false,Key: false}, 
        { name: 'Reference', index: 'Reference', width: 80, align: 'left', editable: false,sortable: true,hidden: false,hidedlg: false,Key: false}, 
        { name: 'CustomerReference', index: 'CustomerReference', width: 140, align: 'left', editable: false,sortable: true,hidden: false,hidedlg: false,Key: false}, 
        { name: 'Logged', index: 'Logged', width: 100, align: 'left', editable: false,sortable: true,hidden: false,hidedlg: false,Key: false}
     ],
     saveObjectInLocalStorage = function (storageItemName, object) {
         if (typeof window.localStorage !== 'undefined') {
             window.localStorage.setItem(storageItemName, JSON.stringify(object));
         }
     },
     removeObjectFromLocalStorage = function (storageItemName) {
         if (typeof window.localStorage !== 'undefined') {
             window.localStorage.removeItem(storageItemName);
         }
     },
     getObjectFromLocalStorage = function (storageItemName) {
         if (typeof window.localStorage !== 'undefined') {
             return $.parseJSON(window.localStorage.getItem(storageItemName));
         }
     },
     myColumnStateName = function (grid) {
         return window.location.pathname + '#' + grid[0].id;
     },
     saveColumnState = function (perm) {
         var colModel = this.jqGrid('getGridParam', 'colModel'), i, l = colModel.length, colItem, cmName,
         postData = this.jqGrid('getGridParam', 'postData'),
         columnsState = {
             search: this.jqGrid('getGridParam', 'search'),
             page: this.jqGrid('getGridParam', 'page'),
             sortname: this.jqGrid('getGridParam', 'sortname'),
             sortorder: this.jqGrid('getGridParam', 'sortorder'),
             rowNum: this.jqGrid('getGridParam', 'rowNum'),
             permutation: perm,
             colStates: {}
         },
         colStates = columnsState.colStates;

         if (typeof (postData.filters) !== 'undefined') {
             columnsState.filters = postData.filters;
         }

         for (i = 0; i < l; i++) {
             colItem = colModel[i];
             cmName = colItem.name;
             if (cmName !== 'rn' && cmName !== 'cb' && cmName !== 'subgrid') {
                 colStates[cmName] = {
                     width: colItem.width,
                     hidden: colItem.hidden
                 };
             }
         }
         saveObjectInLocalStorage(myColumnStateName($grid), columnsState);
     },
     myColumnsState,
     isColState,
     restoreColumnState = function (colModel) {
         var colItem, i, l = colModel.length, colStates, cmName,
         columnsState = getObjectFromLocalStorage(myColumnStateName($grid));

         if (columnsState) {
             colStates = columnsState.colStates;
             for (i = 0; i < l; i++) {
                 colItem = colModel[i];
                 cmName = colItem.name;
                 if (cmName !== 'rn' && cmName !== 'cb' && cmName !== 'subgrid') {
                     colModel[i] = $.extend(true, {}, colModel[i], colStates[cmName]);
                 }
             }
         }
         return columnsState;
    },
    firstLoad = true;

    myColumnsState = restoreColumnState(cm);
    isColState = typeof (myColumnsState) !== 'undefined' && myColumnsState !== null;

    $grid.bind('SaveSettings', function() { saveColumnState.call($grid, $grid.jqGrid('getGridParam', 'remapColumns')); });
    $grid.jqGrid({url: '/Databind/',
        datatype: 'json',
        mtype: 'GET',
        height: '100%', 
        width: 940, 
        shrinkToFit: false, 
        colModel: cm,
        rowNum: isColState ? myColumnsState.rowNum : 15,
        rowList: [5,10,15,30,50],
        pager: $('#gridPager'),
        page: isColState ? myColumnsState.page : 1,
        sortname: isColState ? myColumnsState.sortname : 'BillingRecordId',
        sortorder: isColState ? myColumnsState.sortorder : 'asc',
        search: isColState ? myColumnsState.search : false,
        viewrecords: true,
        loadComplete: function () {
            if (firstLoad) {
                firstLoad = false;
                if (isColState) {
                    $(this).jqGrid('remapColumns', myColumnsState.permutation, true);
                }
             }
             saveColumnState.call($(this), this.p.remapColumns);

             if($(this).jqGrid('getGridParam', 'page') > $(this).jqGrid('getGridParam', 'lastpage')) {
                 alert('reloading'); //this message shows
                 $(this).trigger('reloadGrid', [{ page: 1}]); //this doens't refresh the grid
              }

          }
     }).navGrid('#gridPager', { edit: false, add: false, del: false, refresh: false, search: false });

    $grid.jqGrid('navButtonAdd', '#gridPager', {
        buttonicon: 'ui-icon-closethick',
        caption: 'Reset Settings',
        title: 'Reset Settings',
        onClickButton: function () {
            removeObjectFromLocalStorage(myColumnStateName($grid));
            $grid.unbind('SaveSettings');
            window.location.reload();
        }
    });

    $grid.jqGrid('navButtonAdd', '#gridPager', {
        buttonicon: 'ui-icon-transferthick-e-w',
        caption: 'Choose Columns',
        title: 'Choose Columns',
        onClickButton: function () {
            $(this).jqGrid('columnChooser', {
                done: function (perm) {
                    if (perm) {
                        this.jqGrid('remapColumns', perm, true);
                        saveColumnState.call(this, perm);
                    }
                 }  
             });
         }
     });
});

$(window).unload( function () { $('#grid').trigger('SaveSettings'); });

我已经阅读并找不到解决方案。我尝试将 trigger.('reloadGrid') 移动到 gridComplete 函数中,但它也不起作用。始终显示警报消息,但网格未刷新。

4

2 回答 2

4

我找到了一种解决方法,但它并不完美。如果我使用 setTimeout 为重新加载调用添加延迟,则一切正常。我添加了一个额外的检查以确保 lastPage 超过 0,否则空网格将不断重新加载。

loadComplete: function () {
    if (firstLoad) {
        firstLoad = false;
        if (isColState) {
            $(this).jqGrid('remapColumns', myColumnsState.permutation, true);
        }
    }
    saveColumnState.call($(this), this.p.remapColumns);

    var lastPage = $(this).jqGrid('getGridParam', 'lastpage');
    var page = $(this).jqGrid('getGridParam', 'page');
    if(lastPage > 0 && page > lastPage) {                    
        setTimeout(function () { $('#grid').trigger('reloadGrid', [{ page: 1}]); },150);
    }
}
于 2012-07-04T11:13:25.353 回答
0

介绍

这适用于 jqGrid javascript 版本 4.4.4。

主要问题是 reloadGrid 在我们想要的时候不起作用。为了理解为什么我会解释我今天学到的关于 reloadGrid 的一切。如果这些都不感兴趣,请随时跳到解决方案。

reloadGrid 的工作原理

reloadGrid具有以下伪代码:

  1. 运行 treeGrids 的预处理逻辑
  2. 为多选运行预处理逻辑
  3. 运行页面逻辑和滚动逻辑的预处理逻辑
  4. 填充网格的数据(通过调用populate()populateVisible()

两者都populate具有populateVisible相同的伪代码:

  1. 检查内部变量loading,,if (loading) { return; } else {/*load data*/}
  2. 为分页和分组运行预处理
  3. loading = true
  4. 将数据加载到内存中(取决于通过 ajax 或字符串或本地的数据类型)
  5. 用加载的内存填充网格
  6. loading = false

如何解决这个问题

我无法想象没有 ajax 会有问题。因此,我将只关注ajax。

网格提供了许多有用的事件,我们可以在 ajax 过程中挂钩。不幸的是,我们可以挂钩的所有 jqGrid 事件都发生在第 6 步之前。这意味着loading当我们的事件处理程序被触发时,它总是等于 true。因为当它调用时loadingis falsereloadGrid不会做任何事情populate()

为了解决这个问题,我们需要能够注入我们的逻辑,以便loading在设置为 false 后重新加载到某个位置。我发现的最简单的方法是将我们的逻辑注入到 ajax 完成事件中。对于上面给定的问题,它将如下所示。

function reloadGridIfPageIsBeyondLast() {
    if($(this).jqGrid('getGridParam', 'page') > $(this).jqGrid('getGridParam', 'lastpage')) {
        $(this).trigger('reloadGrid', [{ page: 1}]);
    }
}

$('#grid').jqGrid('setGridParam', { 
    ajaxGridOptions: {
        complete: reloadJqGridIfPagePastLast
    }
}
于 2015-03-12T08:04:29.180 回答