Javascript 在不覆盖侦听器的情况下正确扩展ExtJS组件
考虑以下示例类Javascript 在不覆盖侦听器的情况下正确扩展ExtJS组件,javascript,extjs,extjs4.1,Javascript,Extjs,Extjs4.1,考虑以下示例类Parent: Ext.define('Parent', { ... listeners: { render: { fn: doSomething }, }, }) 下面的类Child扩展了上面的默认Parent: Ext.define('Child', { extend: 'Parent', ... listeners: { afterrender: {
Parent
:
Ext.define('Parent', {
...
listeners: {
render: {
fn: doSomething
},
},
})
下面的类Child
扩展了上面的默认Parent
:
Ext.define('Child', {
extend: 'Parent',
...
listeners: {
afterrender: {
fn: doSomething
},
},
};
即使Child
没有为render
指定侦听器(它只提供afterrender
),在Child
的组件渲染时,render
侦听器(在父类中定义)不再被激发;i、 e.监听器被新的监听器规范覆盖
如何解决此问题?通过在initComponent
中使用on
声明事件处理程序来“修复”问题。因此,子类的示例代码为:
Ext.define('Child', {
extend: 'Parent',
...
initComponent : function(args) {
var me = this;
me.callParent(args);
me.on('afterrender', me.doSomething, this);
},
};
在我看来还是不太好;如果有更好的解决方案,请回答问题。您可以在initComponent
中指定处理程序,而不是使用侦听器
配置对象
Ext.define('Child', {
extend: 'Parent',
...
initComponent: function() {
this.on('afterrender', this.onAfterRender);
},
onAfterRender: function() {
...
}
};
listeners
config方法不起作用的原因是对创建的任何新对象无效。换句话说,它完全覆盖任何引用类型(例如侦听器
对象)
首选使用initComponent
,因为它是专门为子类化而被重写的;然而,像这样有点笨拙的东西可以相对安全地使用:
Ext.define('Child', {
extend: 'Parent',
listeners: Ext.merge(Parent.prototype.listeners || {}, {
...
})
});
我必须承认,它并不比使用initComponent
好多少,但至少它更具声明性。在6.02版中,在子版本中使用新方法配置viewConfig,仍会使viewConfig中的其他方法不受父版本的影响。真的很好 事实上,我认为这是最好的方法initComponent
就是专门为此而设计的。对于配置对象,您只能做这么多…工作,正如您所说的更具声明性,+1ed。请注意,这将改变Parent.prototype.listeners!