2017-08-02 6 views
0

私のextjsグリッド内で、右クリックするとコンテキストメニューが呼び出されます。アイテムの1つをクリックすると、コントローラでメソッドを起動します。これはすべて正常に動作します。問題は、これが呼び出されている親グリッドをコントローラメソッドに渡したいのです。誰かが私にこれを行う方法を教えてもらえますか?extjs contextmenuコントローラメソッドへのパラメータとして親グリッドを渡す

は、これは私のコンテキストメニュー

Ext.define('Example.ContextMenuTradematch', { 
xtype: 'contextMenuTradematch', 
extend: 'Ext.menu.Menu', 
items: [ 
    { 
     text: 'Match Trade', 
     iconCls: 'greenIcon', 
     listeners: { 
      click: {      
       fn: 'onMatchTrade', 
       params: { 
        param1: this 
       } 
      } 
     } 
    }, 
    { 
     text: 'Delete Trade', 
     iconCls: 'deleteIcon', 
     listeners: { 
      click: 'onDeleteTrade' 
     } 
    } 
] 
です

});

、これは私がイベントの発信元のグリッドにアクセスすることができますどのように私のコントローラメソッド

onMatchTrade: function (event, target, options) { 
    debugger; 
    var me = this; 

のですか?

- そしてこれは、これを行う最も簡単な方法です...私は、グリッドに

    title: 'Tradematch Results: UNMATCHED', 
       xtype: 'grid', 
       itemId: 'gridUnmatchedId', 
       ui: 'featuredpanel-framed', 
       cls: 'custom-grid', 
       margin: '0px 10px 0px 10px', 
       flex: 2, 
       width: '100%', 
       bind: { 
        store: '{myTM_ResultsStore}' 
       }, 
       listeners: { 
        itemcontextmenu: 'showContextMenuTradematch' 
       }, 

をコンテキストメニューを追加し、このコントローラは、それを追加する方法をどのように

getContextMenu: function (cMenu) { 
    if (!this.contextMenu) { 
     debugger; 
     this.contextMenu = this.getView().add({ xtype: cMenu }); 
    } 
    return this.contextMenu; 
}, 

showContextMenuTradematch: function (view, rec, node, index, e) { 
    e.stopEvent(); 
    e.stopEvent(); 
    debugger; 
    this.getContextMenu('contextMenuTradematch1').show().setPagePosition(e.getXY()); 
    return false; 
}, 
+0

どのようにグリッドがコントローラに作成するのでしょうか?コンテキスト情報が不十分です。 –

答えて

1

ですExample.ContextMenuTradematchインスタンスを作成するときには(itemcontextmenuリスナーから行うと仮定しています)、グリッドへの参照を渡すことができます。

itemcontextmenu: function (grid, record, item) { 
    // code to create your menu 
    // probably something like: 
    if (!grid.contextMenu) { 
      grid.contextMenu = Ext.create('Example.ContextMenuTradematch', { 
       ownerGrid: grid 
      }); 
    } 

    grid.contextMenu.showBy(item); 
} 

onMatchTradeはそれが署名だExt.menu.Itemインスタンスをクリックすることで解雇された場合には次のようになります。ここでの推測がたくさんありました

onMatchTrade: function (item, e) { 
    var menu = item.up('menu'), 
     grid = menu.ownerGrid; 

    console.log(grid); 
} 

。これがメニューを作成したりメソッドを呼び出す方法ではない場合は、問題を手掛かりに追加すると役立ちます。ここで

は、テンプレートとして使用するバイオリンです:https://fiddle.sencha.com/#view/editor&fiddle/24fc

+0

グリッドにメニューを追加する方法の詳細を追加しました。私がこの方法を選んだ唯一の理由は、私がそれを理解できる唯一の方法だからです。私はより良い方法に開かれています – solarissf

+0

私はあなたがそれをやっている方法を試みたと私はそれを使用すると思う...清潔になるようだ。しかし、問題の1つは、コンテキストメニューがクリックされたボタンから離れていることです。私は以前の方法で次の行でこれを修正しました... this.contextMenu = this.getView()。add({xtype: 'contextMenuTradematch2'})。show()。setPagePosition(e.getXY());どのように私はあなたの例で同じことをすることができますか? – solarissf

+0

はい、単に 'grid.contextMenu.showAt(e.getX()、e.getY())'を使用してください。私はフィドルを更新しました。 –

関連する問題