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

时间:2011-01-14 09:23:11

标签: javascript custom-attributes extend extjs

我的应用程序在过去一年左右一直在增长,我终于开始通过扩展现有组件来拆分常用组件。我发现这非常有用 - 提高开发和维护的速度。我的问题是我没有掌握在我的组件上使用自定义参数的概念,并希望有人可以在以下示例中提供一些帮助。具体来说,我似乎无法访问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);

3 个答案:

答案 0 :(得分:1)

myCustomParam是相关对象的属性。它本身从未被声明为变量。您可以通过jslint运行代码来查看此信息。

您想要this.myCustomParam

但是,如果您尝试传入参数,则可能需要尝试这种方式:

MyGrid = Ext.extend(Ext.grid.GridPanel, {
  constructor: function(cfg) {
    cfg = cfg || {};

    // ... do stuff ...

    MyGrid.superclass.constructor.call(this, cfg);
  }
});

答案 1 :(得分:0)

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

我会以下列方式调试/尝试修复:

  1. 将myCustomParam重命名为 this.myCustomParam和测试
  2. 设置范围和测试
  3. 使用创建getDwrArgsFunction createDelegate方法 (http://dev.sencha.com/deploy/dev/docs/source/Function.html#method-Ext.util.Functions-createDelegate) 并测试
  4. 免责声明:根据您的DwrProxy等(我们无法看到代码),其中一些不会有好处。

答案 2 :(得分:0)

代理无法访问变量,因为它未在代理本身的范围内定义。我过去一直在努力解决这类问题,我认为组件会像闭包一样跟踪变量,但它们不会。

您可以通过将网格范围明确地移交给处理函数来解决您的问题,方法是将其作为委托,您需要更改的是使您想要访问实例变量的变量而不仅仅是局部变量。

的变化:

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' });

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