2017-08-02 50 views
0

在我的extjs网格中,当我右键单击时,我调用上下文菜单。当我点击其中一个项目时,我想在控制器中启动一个方法。这一切工作顺利,问题是我想通过这个被称为从控制器方法的父网格。有人可以告诉我如何做到这一点?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; 

如何访问该事件源于电网?

--and我这是怎么添加上下文菜单电网

    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

我试过你这样做的方式,我想我会用它...似乎更清洁。一个问题是,上下文菜单显示自己远离点击按钮。我通过以下代码解决了这个问题:this.contextMenu = this.getView()。add({xtype:'contextMenuTradematch2'})。show()。setPagePosition(e.getXY());任何想法如何我可以用你的例子做同样的事情? – solarissf

+0

是的,只需使用'grid.contextMenu.showAt(e.getX(),e.​​getY())'。我已经更新了小提琴。 –

相关问题