【问题标题】:Multiple jqGrids in one form causing conflicts for separate initiating variables一种形式的多个 jqGrids 导致单独的启动变量发生冲突
【发布时间】:2015-07-30 20:40:14
【问题描述】:

我的表单中有多个 jqGrid。现在对于我的表单中的多个 jqGrid,我通过包含一个 js 文件来实现它,该文件具有 jqGrid 定义的内容,并且该 js 文件的内容如下:

var MyGridData = MyGridData || (function () {
    var _args = {};
    return {
        init: function (Args){
            _args = Args;
        },
        initiateGrid: function (){
            this.fillGridSchema(_args[6]);
        },
        fillGridSchema: function (){
            $('#' + _args[0]).jqGrid({
                url: _args[1],
                datatype: "json",
                mtype: "POST",
                ajaxGridOptions: {contentType: 'application/json; charset=utf-8' },
                serializeGridData: function(postdata){
                    return JSON.stringify(postdata);
                },
                postData: {colOrder: _args[2], data: _args[3]},
                search: true,
                colNames: _args[4],
                colModel: _args[5],
                viewrecords: true,
                pager: jQuery('#pager_' + _args[7]),
                rowNum: 10,
                rowList: [10, 20, 30, 40],
                //further required jqGrid properties here for ex: sortorder, //loadonce, gridview, ignorecase, etc.
                onSelectRow: function (rowId) {
                    if(_args[8] != ''){
                        var rowData = jQuery(this).getRowData(rowId);
                        var fn = window[_args[4]];
                        if(typeof fn === 'function'){
                            fn(rowData);
                        }
                    }
                }
            });
        }
    }
}

现在为生成 jqGrid,调用以下代码:

MyGridData.init([
    'GridName1', 'griddataurl', 'colOrder', 'postDataargs', 'colNames', 'colModel', 'ExtraParams', 'pager', 'onSelectRowfunction'
]);
MyGridData.initiateGrid();

现在我面临的问题是,我在第一个网格的 rowselect 上填充我的第二个网格,并且我正在以编程方式默认选择我的网格中的第一行。 So when the first row of 1st grid is being selected, then I am calling a function in onSelectRow of 1st grid so as to fill my 2nd grid as per the selection in my first grid in that function.但问题是 _args 参数只在第一次被调用时向我显示了第一个网格的参数。第二次调用第一个网格的 onSelectRow 时,它显示 _args 参数具有第二个网格参数的值,而不是第一个网格的参数。我无法找出其中的问题。如果有人能找出其中的问题,请告诉我解决方案。

【问题讨论】:

  • 您写了关于 两个网格,但我只看到一个调用 MyGridData.initMyGridData.initiateGrid。此外,onSelectRow 使用未定义的fn 变量。说实话,我不喜欢你发布的代码。它使简单的事情非常不利于阅读和理解。 _args[5] 的代码非常不利于阅读(没有名字 - 没有意义)。方法initiateGridfillGridSchema 执行相同的操作,并且两者只能调用一次。对不起,批评家,但我认为你应该完全重写代码以使其易于使用和理解
  • 顺便说一下,您使用字符串值'colNames', 'colModel' 作为_args[4]_args[5] 参数,所以您将拥有colNames: 'colNames', colModel: 'colModel',这是绝对错误的。 colNamescolModel 的值应该是包含相应类型项的数组,而不是字符串。
  • @Oleg 我通过以下两个调用来生成我的两个网格:MyGridData.init([ 'GridName1', 'griddataurlforGrid1', 'colOrderforGrid1', 'postDataargsforGrid1', 'colNamesGrid1', 'colModelGrid1', 'ExtraParamsGrid1', 'pager', 'onSelectRowfunctionforGrid1' ]); MyGridData.initiateGrid();MyGridData.init([ 'GridName2', 'griddataurlforGrid2', 'colOrderforGrid2', 'postDataargsforGrid2', 'colNamesGrid2', 'colModelGrid2', 'ExtraParamsGrid2', 'pager', '' ]); MyGridData.initiateGrid();
  • 考虑我为我的每个网格提供必要的不同参数,我只需要为我的第一个网格调用 onSelectRow,这就是为什么我为第二个网格提供''(空白)参数。跨度>
  • 我之前写过你使用fn 变量(不是_args[8] 之类的东西)。所以'onSelectRowfunctionforGrid1'''的用法没有区别。而且'onSelectRowfunctionforGrid1', ``colNamesGrid1', 'colModelGrid1'`等表示strings,但是你可能有objects对应的名字和使用方式对象而不是名称作为参数。不是吗?

标签: javascript jquery jqgrid mvcjqgrid


【解决方案1】:

抱歉,我不喜欢上面的代码。如果您需要为两个网格使用一些 common 参数,您只需定义

$.extend(true, $.jgrid.defaults, {
    datatype: "json",
    mtype: "POST",
    ajaxGridOptions: {contentType: "application/json; charset=utf-8" },
    serializeGridData: function (postdata) {
        return JSON.stringify(postdata);
    },
    search: true,
    viewrecords: true,
    rowNum: 10,
    rowList: [10, 20, 30, 40],
    gridview: true,
    autoencode: true
});

之后,您可以跳过上述选项创建两个网格。您将创建简短易读的代码来满足您的需求。

顺便说一句,您希望在第一个网格中选择行之后加载第二个网格。在这种情况下,您可以先使用datatype: "local" 创建第二个网格。它将阻止向第二个网格中指定的url 发送任何请求。在第一个网格的onSelectRow 内部,您可以将第二个网格的datatype 动态更改为"json",设置postData 并为第二个网格触发reloadGrid。这当然不是所有需要做的事情。可以考虑清除第一个网格的beforeRequest 内部的第二个网格(或loadComplete 的内部)。它清除了刷新(和取消选择)第一个网格的第二个网格。

【讨论】:

  • 先生,我需要将 jqGrid 的网格模式设置为动态的,以便我可以在表单中添加多个网格,使其每个属性都是动态的并且特定于每个网格。例如:我可能需要在一个网格而不是另一个网格中调用 onSelectRow。感谢您为我的问题提出了很多方法,但据我所知,上述解决方案可能无法解决我的问题。
  • @VinitSharma:如果您编写colModel: _args[5],那么代码将不会更“动态”,因为您需要在_args 的某处填写真正的特定数据。您需要查看用于创建两个或多个网格的整个 代码。 “类”的错误使用会使代码变长、可读性差、难以理解。它没有提供额外的“动态”。我认为我们对实施方式有不同的看法。因此,恐怕您必须自己编写实现,否则其他人可能会在您的问题上发布自己的答案。
猜你喜欢
  • 2015-12-02
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
相关资源
最近更新 更多