正确扩展ExtJS组件而不覆盖侦听器

Jos*_*mit 9 javascript extjs extjs4.1

请考虑以下示例类Parent:

Ext.define('Parent', {

    ...
    listeners: {
        render: {
            fn: doSomething
        },
    },
Run Code Online (Sandbox Code Playgroud)

};

以及上面的类Child扩展默认值Parent:

Ext.define('Child', {
    extend: 'Parent',

    ...
    listeners: {
        afterrender: {
            fn: doSomething
        },
    },
};
Run Code Online (Sandbox Code Playgroud)

即使Child没有指定一个监听器render(它只提供afterrender),render监听器(在Parent类中定义)也不再在Child组件渲染时触发; 即侦听器新的侦听器规范覆盖.

如何解决这个问题?

voi*_*hos 12

您可以指定处理程序initComponent,而不是使用listeners配置对象.

Ext.define('Child', {
    extend: 'Parent',

    ...
    initComponent: function() {
        this.on('afterrender', this.onAfterRender);
    },

    onAfterRender: function() {
        ...
    }
};
Run Code Online (Sandbox Code Playgroud)

该原因listeners的配置方法不起作用是因为传递的配置对象,以Ext.define获取Ext.apply倒是给创建的任何新对象.换句话说,它完全覆盖任何引用类型(例如listeners对象).

使用initComponent是首选,因为它专门设计为重写子类.