我想稍微弯曲一个现有的继承结构,插入另一个自定义编写的层。给出以下继承:

Ext.define('ThirdPartyLib.panel.GridPanel',{
    extend:'Ext.grid.Panel',
    initComponent:function() {
        ...
    }
});

Ext.define('MyApp.view.MyGridView',{
    extend:'Ext.grid.Panel',
    initComponent:function() {
        ...
    }
});

Ext.define('MyApp.view.MySpecialGridView',{
    extend:'MyApp.view.MyGridView',
    initComponent:function() {
        ...
    }
});


现在我想更改第三方库,改为使用父类,因此也执行了我自己的initComponent:

Ext.define('MyApp.override.MyGridView',{
    override:'ThirdPartyLib.panel.GridPanel',
    extend:'MyApp.view.MyGridView'
});


这是行不通的。如果我立即在ThirdPartyLib代码中对其进行更改,那么它将起作用:

Ext.define('ThirdPartyLib.panel.GridPanel',{
    extend:'MyApp.view.MyGridView'
});


但是,只要有新版本的第三方库可用,这就会中断。

Ext.Class.mixins确实允许将新函数混合到旧类中,但是那时我不能覆盖initComponent。

有任何想法吗?

最佳答案

由于从技术上讲,您正在使用Ext JS 4,因此可以通过以下技巧来实现:

Ext.define('', Ext.apply(ThirdPartyLib.panel.GridPanel.prototype, {
    extend: 'MyApp.view.MyGridView'
}));


实际操作中:https://fiddle.sencha.com/#fiddle/spf

请注意,它在Ext JS 5或更高版本中不起作用。

一个干净且可持续的解决方案是将您的自定义内容从initComponent移到mixin,覆盖ThirdPartyLib.panel.GridPanel并在覆盖的initComponent中调用mixin的方法。

10-05 17:42