2011-05-13 17 views
10

私はExtJSを使用していくつかのパネルをアイテムとして含むウィンドウを構築しています。これらのパネルの1つにボタンがあります。ExtJSコントロールから祖先コンテナオブジェクトを参照する方法は?

ボタンをクリックすると、上記のパネルとこのボタンを含むウィンドウを非表示にできるように、ボタンにハンドラをアタッチしたいと考えています。

私の質問は:どのように私のIDのウィンドウを参照せずに、私のボタンの親ウィンドウへの参照を取得できますか?私は文字通り、Ext.Windowインスタンスへの参照を望み、私のボタンを含むExt.Panelインスタンスは必要としません。

注:Ext.Windowクラスをサブクラス化しているため、ウィンドウのIDが常に同じではないため、IDでウィンドウを参照したくありません。要するに、ウィザードクラスを作成しています。ウィザードのキャンセルボタンをクリックすると、ボタンを含むウィザードウィンドウが非表示になります。ここで

は私のコードです:

  1. this.ownerCt.ownerCt(これはボタンであること:ここで

    var newWizardWindow = new WizardWindow({ 
        id: 'newWizardWindow', 
        title: 'New', 
        items: [ 
        ... 
        ], 
        buttons: [{ 
        text: 'Cancel', 
        handler: function() { 
         // REFERENCE WizardWindow instance here. 
        } 
        },{ 
        id: 'newWizardPreviousButton', 
        text: '« Previous', 
        disabled: true, 
        handler: newWizardNavigator.createDelegate(this, [-1]) 
        },{ 
        id: 'newWizardNextButton', 
        text: 'Next »', 
        handler: newWizardNavigator.createDelegate(this, [1]) 
        }], 
        listeners: { 
        … 
        } 
    }); 
    

    は、私は限り、ウィンドウを非表示にする方法などが出ているいくつかのアイデアがあります)。 ExtJSの将来のアップデートでは好都合ではなく、ウィンドウとボタンの間の親の数が変わるかもしれません。

  2. WizardWindowインスタンスへの参照をWizardWindowクラスに格納しておきます。
  3. jQueryファッションで最も近いWizardWindow [CSS]クラスを見つける:$(this).closest( '。wizardWindow')。多分this.findByParentType( 'WizardWindow')?

答えて

8

findParentByType(...)の方法はどうですか?私はそれを数回使って覚えています。

findParentByType( 文字列/ Ext.Component /クラスXTYPE、 [ブール浅い]):Ext.Container

XTYPEまたはクラスによって任意のレベルで、このコンポーネント 上記コンテナを探します。

ここでは参考としてIDの代わりにXTYPEを使用することができますし、XTYPEは関係なく、あなたがそのタイプの持っているもののインスタンスと同じではありません。

buttons: [{ 
    text: 'Cancel', 
    handler: function() { 
     // REFERENCE WizardWindow instance here. 
     var parentWindow = this.findParentByType('xtypelizardwindow'); 
    } 
}] 
+0

私はこの回答に+10を与えることができたらいいですか? –

1

ハンドラプロパティの兄弟として、ボタンの設定で、スコープを追加できますか?newWizardWindowプロパティ?それがうまくいくかどうかは私が100%確信しているわけではありませんが、私はそうするでしょう。これは、ボタンハンドラのスコープをウィンドウに設定し、ハンドラ関数内でthis.hide()を実行するだけです。

+0

あなたはこれを試しましたか?私は同様の問題でこのメソッドを使用しました。http://stackoverflow.com/questions/8588968/extjs-button-scopeそして上記のChauは答えました.... – goh

2

refをスコープとして渡すことができます。

 
buttons: [{ 
    text: 'Cancel', 
    scope:this, 
    handler: function() { 
    } 
}] 
+0

ここでは、 "this"がボタンではないでしょうか?それはあなたの意図ですか? –

+0

ええと、「this」をインラインで使用すると、動作しないと思います。私は同様の質問をしました。 http://stackoverflow.com/questions/8588968/extjs-button-scope – goh

+0

これは機能し、fyiはこれを行う適切な方法です!ハンドラ内の 'this'はクラスそのものになります。 –

0

this.ownerCtは、コンテナである親オブジェクトも参照します。 これを使用しています。findParentByType(親xtype)

関連する問題