16

Extjs Web アプリケーションの開発に数か月の経験があります。私はこの問題に遭遇しました:

クラスをオーバーライドするときは、メソッドを変更し、以前の実装と呼び出しに従いましたcallParent()。オーバーライド部分は機能しますがcallParent()、古い実装が呼び出されます。

私のオーバーライドコード

Ext.override(Ext.layout.component.Draw, {
    finishedLayout: function (ownerContext) {

        console.log("new layouter being overriden");
        this.callParent(arguments);
    }
});

オーバーライドする Extjs クラス メソッド:

finishedLayout: function (ownerContext) {
    var props = ownerContext.props,
        paddingInfo = ownerContext.getPaddingInfo();

    console.log("old layouter being overriden");
    this.owner.setSurfaceSize(props.contentWidth - paddingInfo.width, props.contentHeight - paddingInfo.height);

    this.callParent(arguments);
}

コンソールでは、最初に新しいレイアウタがメッセージを出力し、その後に古いレイアウタの実装が表示されることがわかります... ブレークポイントを配置し、callParent()古いレイアウタと呼ばれる新しいレイアウタの呼び出しスタックを再トレースします。親クラスを呼び出す必要がありますが、オーバーライドされたメソッドは呼び出しません。

この問題を解決する方法はありますか?

4

2 に答える 2

21

ExtJS 4.1.3 以降を使用this.callSuper(arguments)している場合は、オーバーライドされたメソッドを「スキップ」してスーパークラスの実装を呼び出すことができます。

メソッドの ExtJSドキュメントには、次の例が示されています。

Ext.define('Ext.some.Class', {
    method: function () {
        console.log('Good');
    }
});

Ext.define('Ext.some.DerivedClass', {
    method: function () {
        console.log('Bad');

        // ... logic but with a bug ...

        this.callParent();
    }
});

Ext.define('App.patches.DerivedClass', {
    override: 'Ext.some.DerivedClass',

    method: function () {
        console.log('Fixed');

        // ... logic but with bug fixed ...

        this.callSuper();
    }
});

そしてコメント:

patch メソッドは、callParent を使用してスーパークラス メソッドを呼び出すことはできません。これは、バグを含むオーバーライドされたメソッドを呼び出すためです。つまり、上記のパッチは、コンソール ログに "Fixed"、次に "Good" のみを生成しますが、callParent を使用すると、"Fixed"、"Bad"、"Good" の順に生成されます。

于 2013-04-09T14:14:14.900 に答える
5

を使用することはできませんcallParentが、代わりに祖父母クラスのメソッドを直接呼び出すことができます。

GrandparentClass.prototype.finishedLayout.apply(this, arguments);

これは、より一般的な (やや壊れやすい) アプローチです。

this.superclass.superclass[arguments.callee.$name].apply(this, arguments);
于 2013-04-09T13:47:03.963 に答える