在 Extjs 中递归地创建菜单和子菜单

Posted

技术标签:

【中文标题】在 Extjs 中递归地创建菜单和子菜单【英文标题】:create Menu and Sub menu recursively in Extjs 【发布时间】:2017-06-27 05:32:50 【问题描述】:

有没有办法像在 Treepanel Extjs 中创建树节点一样递归地创建菜单和子菜单

假设我有空的菜单项

我阅读了用于构建菜单和子菜单的 xml 输入

我的 xml 看起来像

<r>
<sub>
 <sub1>
  <sub 1.1/>
  <sub 1.1.1/>
</sub1>
<sub2/>
<sub3>
<sub 3.1>
<sub 3.1.1>
</sub3>
</r>

xml可以深入,请提供建议

【问题讨论】:

【参考方案1】:
buildHelpMenuItems: function () 

                var menuItemNodes = Ext.DomQuery.jsSelect('SUB', me.responseXML),
                mb = (toolbarHlpMenu) ? toolbarHlpMenu.menu : '',
                menu,
                menuArray = [];
                newMenuArray = [];
                if(menuItemNodes.length ==0 || !mb)
                    return;
                function buildMenuItem(node, scope) 
                    var menuitem = ;
                    menuitem.text = (node.attributes.getNamedItem('LABEL')) ? node.attributes.getNamedItem('LABEL').nodeValue : '';
                    menuitem.iconCls = (node.attributes.getNamedItem('clsName')) ? node.attributes.getNamedItem('clsName').nodeValue : '';
                    menuitem.url = (node.attributes.getNamedItem('URL')) ? node.attributes.getNamedItem('URL').nodeValue : '';
                    menuitem.handler = scope.helpMenuHandler;
                    menuitem.hidden = (node.attributes.getNamedItem('HIDDEN')) ? eval(node.attributes.getNamedItem('HIDDEN').nodeValue) : false;
                    menuitem.type = (node.attributes.getNamedItem('TYPE')) ? node.attributes.getNamedItem('TYPE').nodeValue : '';
                    return menuitem;
                
                for (var i = 0; i < menuItemNodes.length; i++) 
                    var node = menuItemNodes[i];
                    menuItem = buildMenuItem(node,me);
                    if (!Ext.isEmpty(node.parentNode.getAttribute('LABEL'))) 
                        menuItem.parentEl = node.parentNode.getAttribute('LABEL');
                     else 
                        menuItem.parentEl = "";
                    
                    menuArray.push(menuItem);
                
                for (var i = 0; i < menuArray.length; i++) 
                    var menuItem = menuArray[i];
                    if (menuItem.parentEl == "") 
                        newMenuArray.push(menuItem);
                     else 
                        var parentEl = Ext.Array.findBy(menuArray, function (item) 
                                return (item.text == menuItem.parentEl);
                            );
                        if (Ext.isEmpty(parentEl.menu)) 
                            parentEl.menu = [];
                            parentEl.menu.push(menuItem);
                         else 
                            parentEl.menu.push(menuItem);
                        
                    
                
                mb.add(newMenuArray);

        ,

此代码在 Extjs 4.2 中测试

【讨论】:

以上是关于在 Extjs 中递归地创建菜单和子菜单的主要内容,如果未能解决你的问题,请参考以下文章

在溢出菜单和子菜单中为菜单图标着色

如何在Qt中动态添加菜单

在 PHP 中递归创建多维数组

如何通过悬停而不单击[重复]来显示下拉菜单和子菜单项

如何在 Python curses 中创建菜单和子菜单?

Extjs 子菜单在 Chrome 43 上消失