2013-04-09 7 views
11

Extjs Webアプリケーションを開発してから数ヶ月の経験があります。私はこの問題に遭遇しました:ExtjsクラスをオーバーライドしてcallParentを呼び出す

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

私のオーバーライドExtJSのクラスのメソッドをオーバーライドする

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

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

コード:コンソールで

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()をスタックに戻します。親クラスを呼び出す必要がありますが、オーバーライドされたメソッドは呼び出さないでください。

どのようにこの問題を解決するためのアイデアですか?

+0

申し訳ありませんが取り残さするバージョンを生成するcallParentを使用して、一方で、コンソールログに「固定」し、「グッド」生成しますExtJs 4.1.2を使用しています。選択された答えは正しいアプローチですが、私はそれを使うことができませんでした。代わりに@wantokが提供する答えを使用しました。 –

+0

ところで、あなたのスーパーの1つをバイパスすることは、大きなハックです、それを賢く慎重に使用してください! –

答えて

18

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

ExtJSのdocumentationは、この例を提供します。

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.paches.DerivedClass', { 
    override: 'Ext.some.DerivedClass', 

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

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

     this.callSuper(); 
    } 
}); 

とコメント:

それが含むオーバーライドされたメソッドを呼び出しますので、パッチメソッドがスーパークラスのメソッドを呼び出すためにcallParentを使用することはできませんバグ。言い換えれば、上記のパッチは、唯一の「固定」し、「悪い」し、「良い」

3

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

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

もっと一般的な(やや脆い)アプローチです。

this.superclass.superclass[arguments.callee.$name].apply(this, arguments); 
+0

これはあなたの意図を示しているので、これはもっと明白だと思います。特にオーバーライドされたメソッドをスキップするのはハックのようです –

関連する問題