Javascript 在ExtJS组件中使用自定义属性
我的应用程序在过去一年左右一直在增长,我终于开始通过扩展现有组件来拆分通用组件。我发现这非常有帮助——提高了开发和维护的速度。我的问题是,我还没有掌握在组件上使用自定义参数的概念,希望有人能在下面的示例中提供一些帮助。具体而言,我似乎无法访问initComponent函数中声明的代理中的自定义参数(myCustomParam):Javascript 在ExtJS组件中使用自定义属性,javascript,custom-attributes,extend,extjs,Javascript,Custom Attributes,Extend,Extjs,我的应用程序在过去一年左右一直在增长,我终于开始通过扩展现有组件来拆分通用组件。我发现这非常有帮助——提高了开发和维护的速度。我的问题是,我还没有掌握在组件上使用自定义参数的概念,希望有人能在下面的示例中提供一些帮助。具体而言,我似乎无法访问initComponent函数中声明的代理中的自定义参数(myCustomParam): MyEmployeeGrid = Ext.extend(Ext.grid.GridPanel, { myCustomParam: "CompanyX", initC
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对象 我将通过以下方式调试/尝试修复:
免责声明:根据您的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”。通过使用上述方法,可以为变量设置默认值,并在实例初始化期间使用自定义值覆盖该变量。希望有帮助,让我知道