Javascript 在ExtJS组件中使用自定义属性

Javascript 在ExtJS组件中使用自定义属性,javascript,custom-attributes,extend,extjs,Javascript,Custom Attributes,Extend,Extjs,我的应用程序在过去一年左右一直在增长,我终于开始通过扩展现有组件来拆分通用组件。我发现这非常有帮助——提高了开发和维护的速度。我的问题是,我还没有掌握在组件上使用自定义参数的概念,希望有人能在下面的示例中提供一些帮助。具体而言,我似乎无法访问initComponent函数中声明的代理中的自定义参数(myCustomParam): MyEmployeeGrid = Ext.extend(Ext.grid.GridPanel, { myCustomParam: "CompanyX", initC

我的应用程序在过去一年左右一直在增长,我终于开始通过扩展现有组件来拆分通用组件。我发现这非常有帮助——提高了开发和维护的速度。我的问题是,我还没有掌握在组件上使用自定义参数的概念,希望有人能在下面的示例中提供一些帮助。具体而言,我似乎无法访问initComponent函数中声明的代理中的自定义参数(myCustomParam):

MyEmployeeGrid = Ext.extend(Ext.grid.GridPanel, {
 myCustomParam: "CompanyX",
 initComponent:function() {
    //Store Reader
    var myReader = new Ext.data.JsonReader({
        root : 'objectsToConvertToRecords',
        idProperty: 'id',
        fields : [
            {name: 'id'},
            {name: 'employee', allowBlank:false},
            {name: 'department', allowBlank:false}
        ]
    });

    //Store Proxy
    var dwrProxy = new Ext.ux.data.DwrProxy({
            apiActionToHandlerMap : {
            read : {
                dwrFunction : EmployeeService.readCompanyEmployees,
                getDwrArgsFunction: function(request, recordDataArray, oldRecordDataArray) {
                    return [myCustomParam];
                }
            }
        }
    });

    //Setup Params for the grid
    Ext.apply(this, {
        store: new Ext.data.Store({
             proxy: dwrProxy,
            reader: myReader,
            autoLoad : true,
            autoSave: true
        }),
        columns: [{header: "Employee", dataIndex: 'employee'},
                    {header: "Department", dataIndex: 'department'}]
    });

    MyEmployeeGrid.superclass.initComponent.apply(this, arguments);
} // eo function initComponent

,onRender:function() {
    MyEmployeeGrid.superclass.onRender.apply(this, arguments);
} // eo function onRender

});

Ext.reg('myemployeegrid', MyEmployeeGrid);

我有一种强烈的感觉,这与调用getDwrArgsFunction时的作用域有关。它可能不知道myCustomParam是什么(尽管事实上它应该是this.myCustomParam,并且在应用任何配置后您希望设置它),因为它没有在DwrProxy对象中声明,也没有引用回它所拥有的MyEmployeeGrid对象

我将通过以下方式调试/尝试修复:

  • 将myCustomParam重命名为 这个.myCustomParam和test
  • 设置范围和测试
  • 使用创建getDwrArgsFunction createDelegate (http://dev.sencha.com/deploy/dev/docs/source/Function.html#method-Ext.util.Functions(createDelegate) 和测试

  • 免责声明:根据您的DwrProxy等(我们看不到其代码),其中一些将不好。

    代理无法访问变量,因为它未在代理本身的范围内定义。在过去,我一直在努力解决类似的问题,我认为组件会像闭包一样运行并跟踪变量,但事实并非如此

    您可以通过将网格的作用域显式地交给处理程序函数来解决问题,方法是将其设置为委托,为此您需要更改的是将希望访问的变量设置为实例变量,而不仅仅是局部变量

    变化:

    MyEmployeeGrid = Ext.extend(Ext.grid.GridPanel, {
        myCustomParam: "defaultValue",
        initComponent:function() {
        ...
        //Store Proxy
        var dwrProxy = new Ext.ux.data.DwrProxy({
                apiActionToHandlerMap : {
                read : {
                    dwrFunction : EmployeeService.readCompanyEmployees,
                    getDwrArgsFunction: function(request, recordDataArray, oldRecordDataArray) {
                        return [this.myCustomParam];
                    }.createDelegate(this)
                }
            }
        });
    
    var myGridInstance = new MyEmployeeGrid({ myCustomParam: 'ValueForThisInstance' });
    

    希望这对您有所帮助,祝您好运

    myCustomParam
    是相关对象的属性。它本身从未声明为变量。通过运行代码可以看到这一点

    您需要
    这个.myCustomParam

    但是,如果您试图传入参数,您可能希望改用以下方式:

    MyGrid = Ext.extend(Ext.grid.GridPanel, {
      constructor: function(cfg) {
        cfg = cfg || {};
    
        // ... do stuff ...
    
        MyGrid.superclass.constructor.call(this, cfg);
      }
    });
    

    谢谢你的回答。您是否介意澄清如何使用构造函数实例化MyGrid。它仅仅是
    newmygrid({customParam:“value”})?使用xtype怎么样?我已经更新了它,这样上面的方法就可以工作了。
    cfg
    项中的每个属性都将是新网格上的属性。如果您注册
    MyGrid
    ,您将能够使用
    xtype
    构建一个网格。(即
    Ext.reg(MyGrid,'MyGrid');
    )+1,用于构造建议。我相信构造函数是ext3.x+创建自己组件的首选方法。Ext代码使用它。除非您计划在其中放入一些代码,否则不需要重写构造函数。直接在类上添加configs很好,对于真正是configs的东西(应该能够通过调用代码进行设置)来说,这是首选。另一方面,只有当您计划在
    cfg
    中添加内容时,才需要行
    cfg=cfg | |{}
    。正如在这段代码中所写的,这一行是毫无意义的。我没有从
    initComponent
    复制他的代码,因为我认为这样做很清楚。我会加上一个“做些什么”的评论,让这更清楚。同样,在防止未定义后使用
    cfg
    。我刚刚得到的印象是,他正试图找出如何将变量放入
    initComponent
    call。嗨,罗布,谢谢你的帖子。这是否意味着我在创建网格时无法修改myCustomParam?我需要为每个公司创建MyEmployeeGrid的实例,因此在声明gridHi James时修改myCustomParam,我稍微更改了代码,因为它是错误的,变量声明之前不需要“this”。通过使用上述方法,可以为变量设置默认值,并在实例初始化期间使用自定义值覆盖该变量。希望有帮助,让我知道