Extjs 如何获取菜单的父级?

Extjs 如何获取菜单的父级?,extjs,extjs4,extjs3,Extjs,Extjs4,Extjs3,我正在尝试获取链接菜单的组件。 看一看: Ext.create('Ext.Button', { id: 'MyButton', text: 'Click me', renderTo: Ext.getBody(), menuAlign: 'tl-bl', menu: { itemId: 'MyMenu', forceLayout: true, items: [

我正在尝试获取链接菜单的组件。 看一看:

    Ext.create('Ext.Button', {
    id: 'MyButton',
    text: 'Click me',
    renderTo: Ext.getBody(),
    menuAlign: 'tl-bl',
    menu: {
        itemId: 'MyMenu',        
        forceLayout: true,
        items:
        [
            {
                text  : 'Option 1',
                itemId: 'MyItemMenu1'
            }, {
                text  : 'Option 2',
                itemId: 'MyItemMenu2'
            }, {
                text   : 'Get the parent!',
                itemId : 'MyItemMenu3',
                handler: function(){
                    
                    // Get the item menu.
                    var MyItemMenu3 = this; 
                    alert(MyItemMenu3.getItemId()); 
                    
                    // Get the menu.
                    var MyMenu = MyItemMenu3.ownerCt; 
                    alert(MyMenu.getItemId());
                    
                    // Try to get the button.
                    var MyButton = MyMenu.ownerCt; 
                    alert(MyButton);                    
                    
                    // Returns:                    
                    // 'MyItemMenu3'
                    // 'MyMenu'
                    // undefined                 
                }
            }
        ]
    }
});
在线示例:

有什么想法吗?

试试这个:

Ext.getCmp('My-Button').menu.refOwner
或者对于ExtJS3:

var MyButton = MyItemMenu3.findParentByType('button');

我自己也在学习EXT,所以我不太确定到底发生了什么,但我想我可以这样理解:
console.log(MyMenu.floatParent.id)

在我们的ExtJS4项目中,我们最终只是修补了
AbstractComponent

Ext.AbstractComponent.override({
    up: function(selector) {
        var result = this.ownerCt||this.floatParent;
        if (selector) {
            for (; result; result = result.ownerCt||result.floatParent) {
                if (Ext.ComponentQuery.is(result, selector)) {
                    return result;
                }
            }
        }
        return result;
    }
});
这使得
up()
沿着
ownerCt
链向上走,但如果未定义
ownerCt
,它将查找
floatParent


现在您可以调用
cmp.up('some-selector')
即使它是一个菜单或菜单项。

在最新版本的ExtJS中,至少(4.2),每个Ext.menu.item都有一个可以访问父菜单的
parentMenu
属性。您可以将其子类化为自定义菜单项。

我自己也在学习EXT,所以我不太确定到底发生了什么,但我想我可以这样得到它:console.log(MyMenu.floatParent.id);完美的它起作用了!谢谢。好的,我会把它作为一个答案提交给你:)很高兴它对你有用!我尝试了这两种方法,但总是返回未定义。它与MyMenu.floatParent一起工作。(:谢谢。是的,我会认为我的简单电话可以解决问题。但是没有:)谢谢你的回答。。。施了魔法
Ext.AbstractComponent.override({
    up: function(selector) {
        var result = this.ownerCt||this.floatParent;
        if (selector) {
            for (; result; result = result.ownerCt||result.floatParent) {
                if (Ext.ComponentQuery.is(result, selector)) {
                    return result;
                }
            }
        }
        return result;
    }
});