【问题标题】:overwrite arguments while bind multiple dynamic jqgrid绑定多个动态jqgrid时覆盖参数
【发布时间】:2016-03-22 13:33:27
【问题描述】:

我有以下绑定 jqgrid 的代码。我的页面中有多个 jqgrid。 我通过下面的代码动态绑定所有。

var MyGridData = MyGridData || (function() {

return {
   init : function(Args) {
       _args = Args;
  },
initiateGrid: function() {
  this.fillGridSchema(_args[6]);
 },
fillGridSchema : function() {
   $('#' + _args[0]).jqGrid({

       //All basic code for binding jqgrid (url,colnames...)

   });
 }
}

当我想绑定我的 SalesInquiryDetails Grid 时,我会调用下面的代码。

MyGridData.init([ 'SalesInquiryDetails',...(other required args) ]);
MyGridData.initiateGrid();

如果我想绑定 SalesReferenceGrid 那么,

MyGridData.init([ 'SalesInquiryReference',...(other required args) ]);
MyGridData.initiateGrid();

现在,我每次都得到最后一个绑定网格的 _args。并且没有收到我为之前的网格定义的事件。

请指导我。 如何触发先前 args 数组中给出的先前网格事件函数。

提前致谢。

【问题讨论】:

    标签: javascript c# jquery jqgrid


    【解决方案1】:

    现在,我每次都得到最后一个绑定网格的 _args。

    对,因为你只有一个_args 变量,它是一个全局变量。您的代码通过在松散模式下分配给未定义的符号而成为我所说的The Horror of Implicit Globals 的牺牲品,该符号会伸出并创建一个全局变量。 JavaScript 的主要缺陷之一,在 2009 年被严格模式修复。(我强烈推荐使用严格模式。)

    为了拥有多个_args,您可能希望init 返回一些东西(一个对象),在其上存储_args,然后在该对象上调用initiateGrid。你的单例只能记住你设置的最后一个状态,所以不要让它成为单例。

    您可以这样做的一种方法是使用标准构造函数:

    var MyGridData = MyGridData || (function() {
        function MyGridData(args) {
            this.args = args;
        }
        MyGridData.prototype.initiateGrid = function() {
            this.fillGridSchema(this.args[6]);
        };
        MyGridData.prototype.fillGridSchema = function(/*shouldn't you be using an arg here, since you pass one in `initiateGrid`?*/) {
            $('#' + this.args[0]).jqGrid({
                //All basic code for binding jqgrid (url,colnames...)
            });
        };
    
        return MyGridData;
    })();
    
    // Usage
    var salesDetailsGrid = new MyGridData([ 'SalesInquiryDetails',...(other required args) ]);
    salesDetailsGrid.initiateGrid();
    
    var salesInquiryGrid = new MyGridData.init([ 'SalesInquiryReference',...(other required args) ]);
    salesInquiryGrid.initiateGrid();
    

    或者使用 ES2015:

    let MyGridData = MyGridData || (function() {
        class MyGridData {
            constructor(args) {
                this.args = args;
            }
            initiateGrid() {
                this.fillGridSchema(this.args[6]);
            }
            fillGridSchema(/*shouldn't you be using an arg here, since you pass one in `initiateGrid`?*/) {
                $('#' + this.args[0]).jqGrid({
                    //All basic code for binding jqgrid (url,colnames...)
                });
            }
        }
    
        return MyGridData;
    })();
    
    // Usage
    let salesDetailsGrid = new MyGridData([ 'SalesInquiryDetails',...(other required args) ]);
    salesDetailsGrid.initiateGrid();
    
    let salesInquiryGrid = new MyGridData.init([ 'SalesInquiryReference',...(other required args) ]);
    salesInquiryGrid.initiateGrid();
    

    但是 JavaScript 很灵活,还有很多其他的方式,比如工厂函数。

    注意:以上代码仅作为一个示例,并不代表经过测试或彻底审查的代码。

    【讨论】:

    • sorry ES2015是什么意思?
    • @Jaykishan:JavaScript 规范的最新版本,从技术上讲是 ECMAScript 规范,是 ECMAScript 2015,于去年 6 月发布。所以 ES2015 是最新的,ES5(ECMAScript 5)是之前的(2009),ES3(1999)是之前的。 (没有 ES4。)浏览器正在努力支持 ES2015 中的所有新功能。有些,比如最新的 Chrome,非常接近。但当然,旧版浏览器永远不会。
    • 我应该在哪里声明参数?
    • @Jaykishan:再说一次,你不能只用一个args。这就是为什么我用一个对象展示了上面的解决方案。
    • 我没有在 $('#' + this.args[0]).jqGrid({ //绑定 jqgrid (url,colnames...) 的所有基本代码中获取 this.args } );我想在 jqgrid 的事件上调用函数名动态。像 loadcomplete : function() { var fn = window[_args[2]]; if (typeof fn === 'function') { fn(); } }
    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多