2017-08-02 2 views
0

Dans ma grille extjs, lorsque je clique avec le bouton droit de la souris, j'appelle un menu contextuel. Lorsque je clique sur l'un des éléments, je veux lancer une méthode dans le contrôleur. Tout cela fonctionne avec succès, le problème est que je veux passer la grille parente à laquelle on appelle cela dans la méthode du contrôleur. Quelqu'un peut-il me montrer comment faire?extjs contextuel du menu, passer la grille parente comme paramètre à la méthode du contrôleur

Ceci est mon menu contextuel

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' 
     } 
    } 
] 

});

alors ceci est ma méthode de commande

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

Comment puis-je accéder à la grille que l'origine de l'événement?

--et voici comment ajouter le menu contextuel de la grille

    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' 
       }, 

et voici comment le contrôleur ajoute ...

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

Comment créer la grille au contrôleur? Il n'y a pas assez d'informations contextuelles. –

Répondre

1

La meilleure façon de le faire est Lorsque vous créez votre instance Example.ContextMenuTradematch - que je suppose que vous faites à partir d'un écouteur itemcontextmenu - alors vous pouvez passer une référence à la grille.

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); 
} 

Si onMatchTrade a été tiré en cliquant sur une instance Ext.menu.Item alors il est la signature sera:

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

    console.log(grid); 
} 

Il y avait beaucoup de deviner ici. Si ce n'est pas de cette façon que vous créez votre menu ou appelez les méthodes, l'ajout d'un violon avec le problème serait utile.

est un violon à utiliser ici comme modèle: https://fiddle.sencha.com/#view/editor&fiddle/24fc

+0

J'ai ajouté plus de détails sur comment j'ajoute le menu à la grille. La seule raison pour laquelle j'ai choisi cette voie est parce que c'est la seule façon que j'ai pu comprendre. Je suis ouvert à une meilleure façon – solarissf

+0

J'ai essayé la façon dont vous le faites et je pense que je vais l'utiliser ... semble être plus propre. Un problème cependant, le menu contextuel se montre loin du bouton cliqué. J'ai corrigé ceci sur mon chemin précédent par la ligne suivante ... this.contextMenu = this.getView(). Add ({xtype: 'contextMenuTradematch2'}). Show(). SetPagePosition (e.getXY()); une idée de comment je peux faire la même chose avec votre exemple? – solarissf

+0

Oui, utilisez simplement 'grid.contextMenu.showAt (e.getX(), e.getY())'. J'ai mis à jour le violon. –