Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在不覆盖侦听器的情况下正确扩展ExtJS组件_Javascript_Extjs_Extjs4.1 - Fatal编程技术网

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!