10

次のクラスの例を考えてみましょうParent

Ext.define('Parent', {

    ...
    listeners: {
        render: {
            fn: doSomething
        },
    },

};

Child上記のデフォルトを拡張する次のクラスParent

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

    ...
    listeners: {
        afterrender: {
            fn: doSomething
        },
    },
};

Childのリスナーを指定していなくてもrender(提供するだけですafterrender)、renderリスナー(クラスで定義されている)は、のコンポーネントレンダリングParent時に起動されなくなります。Childつまり、リスナーは新しいリスナー仕様によって上書きされます。

これを修正する方法は?

4

4 に答える 4

13

configオブジェクトinitComponentを使用する代わりに、でハンドラーを指定できます。listeners

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

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

    onAfterRender: function() {
        ...
    }
};

listenersconfigメソッドが機能しない理由は、に渡されるconfigオブジェクトExt.defineExt.applyが作成された新しいオブジェクトに' dされるためです。つまり、参照型(listenersオブジェクトなど)を完全に上書きします。

initComponentサブクラス化のためにオーバーライドされるように特別に設計されているため、使用することをお勧めします。

于 2013-01-29T18:09:57.697 に答える
3

さて、現時点ではフレームワークにクリーンなソリューションはありません。ただし、このような少し厄介なものは比較的安全に使用できます。

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

    listeners: Ext.merge(Parent.prototype.listeners || {}, {
        ...
    })
});

使用するよりもはるかに優れているわけではありませんinitComponentが、少なくとももう少し宣言的であることを認めなければなりません。

于 2013-01-29T20:35:59.427 に答える
2

initComponentを使用してイベントハンドラーを宣言することによる「修正済み」の問題on。したがって、子クラスのサンプルコードは次のようになります。

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

    ...
    initComponent : function(args) {
        var me = this;
        me.callParent(args);
        me.on('afterrender', me.doSomething, this);
    },
};

それでも私にはそれほど素敵に見えません。誰かがより良い解決策を持っているなら、質問に答えてください。

于 2013-01-29T18:09:54.007 に答える
0

バージョン6.02では、子で新しいメソッドを使用してviewConfigを構成しても、親からviewConfig内の他のメソッドを保持します。本当に良い。

于 2017-01-11T14:18:53.457 に答える