`
jameszhao83
  • 浏览: 67493 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

根据后台json生成左侧导航菜单

阅读更多
文章内不再提供示例,需要查看者请从SVN下载,地址:
http://exttools.googlecode.com/svn/trunk/
效果图:


Js代码
  1. /** 
  2.  * 扩展了Panel类,其布局设为accordion,所在区域为west;该组件初始化后会根据配置的url和root向后台发 
  3.  * 起请求并解析返回的json串,根据parentcode为空的结点生成TreePanel,子节点通过parentcode属性添加为 
  4.  * 对应结点的子节点,注意此处每个节点的code必须小于父节点并接大于下方的其它结点; 
  5.  *  
  6.  * 1.1更新: 
  7.  * 1.不再需要leaf属性,程序内部判断; 
  8.  * 2.store用完后即销毁,不再可用; 
  9.  * 3.修改了结点点击的触发事件,仅注册一次以减少内存占用,该方法传递给监听函数一个Ext.tree.TreeNode对象, 
  10.  * 可通过node.attributes属性获取结点属性; 
  11.  * 4.添加了一个findNodeById方法,该方法通过id字符串返回对应Ext.tree.TreeNode对象; 
  12.  *  
  13.  * @author chemzqm@gmail.com 
  14.  * @version 1.1 
  15.  * @since 2010-5-9 
  16.  * 
  17.  */  
  18. Ext.namespace("QM.ui");  
  19.   
  20. QM.ui.AccordinTreePanel = Ext.extend(Ext.Panel, {  
  21.     /** 
  22.      * @cfg(url) 发送请求的地址 
  23.      */  
  24.     /** 
  25.      * @cfg(root) json数组的根字符串 
  26.      */  
  27.     margins: '5 0 5 5',  
  28.     split: true,  
  29.     width: 210,  
  30.     initComponent: function(){  
  31.         Ext.apply(this, {  
  32.             layout: 'accordion',  
  33.             region: 'west'  
  34.         })  
  35.         QM.ui.AccordinTreePanel.superclass.initComponent.call(this);  
  36.         this.addEvents(        /** 
  37.          * @event itemclick  树结点被点击时触发  参数:node 当前结点对象,record 当前结点对应record对象 
  38.          */  
  39.         'click',        /** 
  40.          * @event afterload 菜单项加载完毕后触发 
  41.          */  
  42.         'afterload');  
  43.         if (!this.store) {  
  44.             this.store = new Ext.data.JsonStore({  
  45.                 url: this.url,  
  46.                 root: this.root,  
  47.                 fields: ['code''name''parentcode''iconCls''href']  
  48.             });  
  49.         }  
  50.         this.store.load({  
  51.             callback: this.loadTrees,  
  52.             scope: this  
  53.         });  
  54.     },  
  55.     loadTrees: function(records, o, s){  
  56.         var pnodes,trees = [],tree;  
  57.         this.store.sort('code');  
  58.         for (var i = 0; i < records.length; i++) {  
  59.             var record = records[i];  
  60.             if (!record.get('parentcode')) {  
  61.                 tree = this.creatTreeConfig(record);  
  62.                 trees.push(tree);  
  63.                 pnodes = [];  
  64.                 pnodes.push(tree.root);  
  65.             }  
  66.             else {  
  67.                 var next_record = records[i + 1];  
  68.                 var isLeaf = !next_record || next_record.get('parentcode') != record.get('code');  
  69.                 this.addTreeNode(pnodes, record, isLeaf);  
  70.             }  
  71.         }  
  72.         Ext.each(trees,function(tree){  
  73.             this.add(tree);  
  74.         },this);  
  75.         this.fireEvent('afterload'this);  
  76.         this.mon(this.el, 'click'this.onClick, this);  
  77.         this.doLayout();  
  78.         this.store.destroy();  
  79.     },  
  80.     findNodeById:function(id){  
  81.         var node,trees = this.findByType('treepanel',true);  
  82.         Ext.each(trees,function(tree){  
  83.             node = tree.getNodeById(id);  
  84.             return !node;//找到的话返回false  
  85.         });  
  86.         return node;  
  87.     },  
  88.     onClick: function(e, t, o){  
  89.         if(Ext.fly(t).hasClass('x-tree-ec-icon')){//点击伸展按钮时无视  
  90.             return;  
  91.         }  
  92.         var el,id,node;     
  93.         if (el = e.getTarget('.x-tree-node-el', 3,true)) {  
  94.             e.stopEvent();  
  95.             id = el.getAttributeNS('ext','tree-node-id');  
  96.             node = this.findNodeById(id);  
  97.             this.fireEvent('click',node);  
  98.         }  
  99.     },  
  100.     creatTreeConfig: function(record){  
  101.         var config = {  
  102.             xtype: 'treepanel',  
  103.             autoScroll: true,  
  104.             rootVisible: false,  
  105.             title: record.get('name'),  
  106.             iconCls: record.get('iconCls'),  
  107.             root: {  
  108.                 nodeType: 'async',  
  109.                 expanded: true,  
  110.                 id: record.get('code'),  
  111.                 children: []  
  112.             }  
  113.         };  
  114.         return config;  
  115.     },  
  116.     addTreeNode: function(pnodes, record, isLeaf){  
  117.         var len = pnodes.length;  
  118.         for (var i = len - 1; i >= 0; i--) {  
  119.             if (pnodes[i].id != record.get('parentcode')) {  
  120.                 pnodes.pop();  
  121.             }  
  122.             else {  
  123.                 var parent = pnodes[i].children;  
  124.                 var node = {  
  125.                     text: record.get('name'),  
  126.                     id: record.get('code'),  
  127.                     iconCls: record.get('iconCls'),  
  128.                     href: record.get('href'),  
  129.                     leaf: isLeaf  
  130.                 };  
  131.                 if (!isLeaf) {  
  132.                     node.children = [];  
  133.                     pnodes.push(node);  
  134.                 }  
  135.                 parent.push(node);  
  136.                 return;  
  137.             }  
  138.         }  
  139.     }  
  140. });  
  141.   
  142. Ext.reg('accTree', QM.ui.AccordinTreePanel);  
/**
 * 扩展了Panel类,其布局设为accordion,所在区域为west;该组件初始化后会根据配置的url和root向后台发
 * 起请求并解析返回的json串,根据parentcode为空的结点生成TreePanel,子节点通过parentcode属性添加为
 * 对应结点的子节点,注意此处每个节点的code必须小于父节点并接大于下方的其它结点;
 * 
 * 1.1更新:
 * 1.不再需要leaf属性,程序内部判断;
 * 2.store用完后即销毁,不再可用;
 * 3.修改了结点点击的触发事件,仅注册一次以减少内存占用,该方法传递给监听函数一个Ext.tree.TreeNode对象,
 * 可通过node.attributes属性获取结点属性;
 * 4.添加了一个findNodeById方法,该方法通过id字符串返回对应Ext.tree.TreeNode对象;
 * 
 * @author chemzqm@gmail.com
 * @version 1.1
 * @since 2010-5-9
 *
 */
Ext.namespace("QM.ui");

QM.ui.AccordinTreePanel = Ext.extend(Ext.Panel, {
    /**
     * @cfg(url) 发送请求的地址
     */
    /**
     * @cfg(root) json数组的根字符串
     */
    margins: '5 0 5 5',
    split: true,
    width: 210,
    initComponent: function(){
        Ext.apply(this, {
            layout: 'accordion',
            region: 'west'
        })
        QM.ui.AccordinTreePanel.superclass.initComponent.call(this);
        this.addEvents(        /**
         * @event itemclick  树结点被点击时触发  参数:node 当前结点对象,record 当前结点对应record对象
         */
        'click',        /**
         * @event afterload 菜单项加载完毕后触发
         */
        'afterload');
        if (!this.store) {
            this.store = new Ext.data.JsonStore({
                url: this.url,
                root: this.root,
                fields: ['code', 'name', 'parentcode', 'iconCls', 'href']
            });
        }
        this.store.load({
            callback: this.loadTrees,
            scope: this
        });
    },
    loadTrees: function(records, o, s){
        var pnodes,trees = [],tree;
        this.store.sort('code');
        for (var i = 0; i < records.length; i++) {
            var record = records[i];
            if (!record.get('parentcode')) {
                tree = this.creatTreeConfig(record);
				trees.push(tree);
                pnodes = [];
                pnodes.push(tree.root);
            }
            else {
                var next_record = records[i + 1];
                var isLeaf = !next_record || next_record.get('parentcode') != record.get('code');
                this.addTreeNode(pnodes, record, isLeaf);
            }
        }
		Ext.each(trees,function(tree){
			this.add(tree);
		},this);
        this.fireEvent('afterload', this);
        this.mon(this.el, 'click', this.onClick, this);
        this.doLayout();
        this.store.destroy();
    },
	findNodeById:function(id){
		var node,trees = this.findByType('treepanel',true);
		Ext.each(trees,function(tree){
			node = tree.getNodeById(id);
			return !node;//找到的话返回false
		});
		return node;
	},
    onClick: function(e, t, o){
		if(Ext.fly(t).hasClass('x-tree-ec-icon')){//点击伸展按钮时无视
			return;
		}
		var el,id,node;   
		if (el = e.getTarget('.x-tree-node-el', 3,true)) {
			e.stopEvent();
			id = el.getAttributeNS('ext','tree-node-id');
			node = this.findNodeById(id);
			this.fireEvent('click',node);
		}
    },
    creatTreeConfig: function(record){
        var config = {
            xtype: 'treepanel',
            autoScroll: true,
            rootVisible: false,
            title: record.get('name'),
            iconCls: record.get('iconCls'),
            root: {
                nodeType: 'async',
                expanded: true,
                id: record.get('code'),
                children: []
            }
        };
        return config;
    },
    addTreeNode: function(pnodes, record, isLeaf){
        var len = pnodes.length;
        for (var i = len - 1; i >= 0; i--) {
            if (pnodes[i].id != record.get('parentcode')) {
                pnodes.pop();
            }
            else {
                var parent = pnodes[i].children;
                var node = {
                    text: record.get('name'),
                    id: record.get('code'),
                    iconCls: record.get('iconCls'),
                    href: record.get('href'),
                    leaf: isLeaf
                };
                if (!isLeaf) {
                    node.children = [];
                    pnodes.push(node);
                }
                parent.push(node);
                return;
            }
        }
    }
});

Ext.reg('accTree', QM.ui.AccordinTreePanel);


示例js:
Js代码
  1. new Ext.Viewport({  
  2.                     layout: 'border',  
  3.                     items: [{  
  4.                         xtype: 'accTree',  
  5.                         title : '菜单',  
  6.                         root : 'menus',//必须要配  
  7.                         url: 'menu.json',//必须要配  
  8.                         listeners:{  
  9.                             'click':function(node){  
  10.                                 alert(node.attributes.href);  
  11.                             }  
  12.                         }  
  13.                     }, {  
  14.                         region: 'center',  
  15.                         html: 'center'  
  16.                     }]  
  17.                 });  
  18.             });  
分享到:
评论

相关推荐

    layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)

    在本文中,我们将探讨如何使用layui框架动态渲染生成左侧3级菜单,特别是在后端返回数据的情况下。layui是一款轻量级的前端UI框架,提供了一系列丰富的组件,包括表格、表单、按钮、弹窗等,同时也支持自定义的扩展...

    adminlet左侧导航提取,可后台获取生成菜单

    - **动态生成**:描述中提到的“后台获取数据填充动态生成”,意味着前端通过AJAX或者Fetch API向后端请求数据,然后根据返回的数据动态渲染导航菜单。这种方式使得菜单可以根据用户权限或其它条件动态变化。 **2....

    动态生成菜单树

    在后台,我们需要执行SQL查询,从`menus`表中获取所有菜单数据,并根据`parent_id`组织成树形结构。可以使用递归方法或者DFS(深度优先搜索)/BFS(广度优先搜索)算法来构建树。 3. 数据传递: 将构建好的树形...

    自己写的左侧四级导航菜单(js,asp.net,C#)

    本文将以“自己写的左侧四级导航菜单”为主题,深入探讨使用js、asp.net及C#实现这一功能的方法。 首先,四级导航菜单通常用于组织复杂的信息架构,它可以清晰地展示网站或应用程序的层级结构,让用户能够通过四层...

    SDMenu 可折叠/展开的后台左侧管理菜单.rar

    SDMenu是一款专为后台管理系统设计的可折叠/展开的左侧导航菜单。在Web开发中,尤其是在构建管理界面时,一个良好的导航菜单对于提升用户体验至关重要。SDMenu提供了这种功能,允许用户根据需要收起或展开菜单项,...

    swagger接口文档改良添加左侧菜单.rar

    Swagger接口文档改良添加左侧菜单是针对API开发过程中的一个重要优化,旨在提高开发人员对API文档的使用效率。Swagger是一款流行的RESTful API文档工具,它能够自动生成、描述、测试和发现Web服务接口。通过在...

    ruoyivue3菜单修改,顶部一、二级,左侧三级,选择二级自动选择左侧第一个三级

    Ruoyi 是一个基于 Vue.js 的企业级后台管理框架,它的菜单通常是通过 JSON 数据动态生成的。在 `src/config/menu.js` 文件中,你可以找到菜单的配置数据。这里你需要根据需求调整菜单的层级和对应关系。 1. **一级...

    多种左侧树形菜单导航

    在IT行业中,尤其是在Web开发领域,左侧树形菜单导航是一种常见的设计模式,它主要用于网站或应用的后台管理系统,帮助用户高效地浏览和操作各种功能模块。这种导航方式以树状结构展示,通常由js(JavaScript)实现...

    天猫左侧导航菜单分类列表

    【天猫左侧导航菜单分类列表】是一个常见的网页设计元素,尤其在电商网站中广泛使用,用于组织和展示商品的各类目,方便用户快速找到所需商品。这个项目涉及到的主要知识点包括前端开发语言HTML、CSS以及JavaScript...

    实现layui左侧菜单右侧显示页面内容的静态文件

    layui提供了多种布局方式,其中一种是左右两栏布局,适用于左侧展示导航菜单,右侧展示内容。这种布局可以通过layui的内置CSS类和JavaScript API来实现。 3. 左侧菜单: layui提供了一套完善的菜单系统,可以方便...

    多级菜单的图标添加及路由配置.rar

    它可以是侧边栏菜单、顶部导航菜单等形式,常见于各种管理后台、CMS(内容管理系统)等应用场景。 2. **图标添加**: - **UI库集成**:许多现代前端框架如Element UI、Ant Design等提供了丰富的图标库,通过引入...

    jquery网站后台管理系统导航

    通过`addClass()`、`removeClass()`和`toggleClass()`等方法,可以轻松地实现导航菜单的高亮和选中状态。 菜单导航则是对系统功能的逻辑分类,通常包括如用户管理、权限设置、数据统计等模块。在jQuery中,我们可以...

    nodejs做的一个树形菜单框架和数据库文件

    在这个特定的项目中,"nodejs做的一个树形菜单框架和数据库文件"是一个利用Node.js构建的系统,它实现了树形菜单结构,这种结构常用于Web应用程序的左侧导航栏,以组织和展示多级的菜单项。用户可以通过点击这些菜单...

    jQuery无限极侧边下拉菜单代码

    在网页设计中,导航菜单是用户与网站交互的重要部分,而侧边下拉菜单更是常见且实用的设计元素。本篇文章将详细探讨如何利用jQuery实现一个无限极的侧边下拉菜单,以及其在后台框架中的应用。 首先,我们要理解...

    layui自定义ajax左侧三级菜单

    本知识点详细介绍了如何使用layui框架通过Ajax请求动态生成左侧三级菜单。 Layui是一款基于jQuery的前端UI框架,以简单、轻量和模块化著称,广泛用于构建Web界面。 ### 知识点一:引入layui相关模块 在实现自定义...

    信息系统后台框架

    "左右框架模式"通常指的是左侧为菜单栏,右侧显示具体内容的布局方式,这是一种常见的后台界面设计模式,方便用户快速定位和操作。 【web系统后台】标签表明这个框架专注于构建基于Web的应用程序,通常包括但不限于...

    ASP.net + Extjs 网站通用后台框架

    开发者可以通过配置JSON数据源来动态生成树形结构,方便用户导航和访问不同级别的管理模块。 2. **AJAX+xml操作**:利用ASP.NET的AjaxControlToolkit或jQuery AJAX库,以及XML数据格式,实现异步数据传输和更新。这...

Global site tag (gtag.js) - Google Analytics