首页 > 解决方案 > 是什么导致 jqgrid 事件多次触发?

问题描述

我们的 jqgrid 配置在一个 initgrid 函数中,该函数被称为就绪处理程序的最后一条语句。出于某种原因,gridcomplete 函数被多次调用。使用下面的代码,它被调用了两次,但它已经被调用了 3 次。两次已经够糟糕了。多次单步执行后,我看不到是什么触发了 gridComplete 函数的第二次执行。

当我在gridComplete开始时点击调试器时,每次调用堆栈实际上都是相同的,唯一的区别是在jqgrid中调用'L':

调用堆栈:

任何人都知道为什么会发生这种情况?我们在 ASP.net MVC 应用程序中使用免费版本 4.13。

$(function(){
    ....
    initGrid();
}

function initGrid(){
$gridEl.jqGrid({
        xhrFields: {
            cors: false
        },
        url: "/IAConsult/GetWorkFlowIARequests",
        postData: {
            showAll: showAllVal,
            role: role,
            IsIAArchitect: userIsIA
        },
        datatype: "json",
        crossDomain: true,
        loadonce: true,
        mtype: 'GET',
        sortable: true,
        viewrecords: true,
        pager: '#workFlowIAGridPager',
        multiselect: true,
        rowNum: 50,
        autowidth: true,
        colModel: [...],
        beforeSelectRow: function (rowid, e) {
            var $myGrid = $(this),
                i = $.jgrid.getCellIndex($(e.target).closest('td')[0]),
                cm = $myGrid.jqGrid('getGridParam', 'colModel');
            return (cm[i].name === 'cb');
        },
        jsonReader: {
            repeatitems: true,
            root: "IAConsultWorkflowRequestsList"
        },
        beforeSubmitCell: function (rowid, name, value, iRow, iCol) {
            return {
                gridData: gridData
            };
        },
        serializeCellData: function (postdata) {
            return JSON.stringify(postdata);
        },
        gridComplete: function () {
            console.log('grid complete');
            let rowIDs = $gridEl.getDataIDs();
            let inCompleteFlag = false;
            let dataToFilter = $gridEl.jqGrid('getGridParam', 'lastSelectedData').length == 0
                ? $gridEl.jqGrid("getGridParam", "data")
                : $gridEl.jqGrid('getGridParam', 'lastSelectedData');
            let $grid = $gridEl, postfilt = "";
            let localFilter = $gridEl.jqGrid('getGridParam', 'postData').filters;
            let columnNames = columns.split(',');

            $('.moreItems').on('click', function () {
                $.modalAlert({
                    body: $(this).data('allitems'),
                    buttons: {
                        dismiss: {
                            caption: 'Close'
                        }
                    },
                    title: 'Design Participants'
                });
            });

            rowCount = $gridEl.getGridParam('records');
            gridViewRowCount = rowCount;

            let getUniqueNames = function (columnName) {
                ...             };

            let buildSearchSelect = function (uniqueNames) {
                var values = {};
                values[''] = 'All';
                $.each(uniqueNames,
                    function () {
                        values[this] = this;
                    });
                return values;
            };

            let setSearchSelect = function (columnName) {
                ...

            };

            function getSortOptionsByColName(colName) {
                ...
            }



            $grid.jqGrid("filterToolbar",
                { stringResult: true, searchOnEnter: true });


            if (localFilter !== "" && localFilter != undefined) {
                globalFilter = localFilter;
            }

            let grid = $gridEl.jqGrid("setGridParam",
                {
                    postData: {
                        "filters": globalFilter,
                        showAll: showAllVal,
                        role: role,
                        IsIAArchitect: userIsIA
                    },
                    search: true,
                    forceClientSorting: true
                });

            //grid.trigger("reloadGrid");
            //Ending Filter code


            for (i = 0; i < columnNames.length; i++) {

                var htmlForSelect = '<option value="">All</option>';
                var un = getUniqueNames(columnNames[i]);
                var $select = $("select[id='gs_workFlowIAGrid_" + columnNames[i] + "']");
                for (j = 0; j < un.length; j++) {
                    val = un[j];

                    htmlForSelect += '<option value="' + val + '">' + val + '</option>';
                }
                $select.find('option').remove().end().append(htmlForSelect);
            }
            debugger;
        },

        // all grid parameters and additionally the following
        loadComplete: function () {
            $gridEl.jqGrid('setGridWidth', $(window).width(), true);
            $gridEl.setGridWidth(window.innerWidth - 20);
        },

        height: '100%'
    });

标签: jqgrid

解决方案


还添加属性 loadonce: true 可能会有所帮助。


推荐阅读