ExtJS4.2 根据数据库记录构建树形菜单

背景:最近用ExtJS4.2做一个系统,需要在前端展示资源菜单,为树形结构,该树形结构是从数据库动态加载的。

ExtJS的树形结构大致有两种情况:

1.静态树形结构,此处不多说,看API就能简单明白;

2.动态加载,ExtJS的特性是根据父节点ID来查询子节点,从而动态更新树形菜单,这里有一个缺陷,或许是我孤陋寡闻不知道,那就是无法根据数据库节点信息自动构建成为一棵树,记得zTree插件就有这个功能。

那么,我希望能够根据数据库树节点信息自动的构建成一棵树,就需要自己去写个小算法在后台拼接成ExtJS需要的数据结构。

代码部分:

1.节点pojo,必要属性有:节点ID(id)、父节点ID(parentId)、文本信息(text)、孩子(children),其他属性,比如节点url,顺序order等根据自己需要设置。

public class Resource {
    private Integer id;
    private String text;
    private Integer parentId;
    private Boolean expanded;
    private List<Resource> children = new ArrayList<Resource>();  
}

2.根据查询出来的节点List集合拼装成为前端展示需要的结构,这里写了个静态方法。

    public static final <T> List<T> buildTree(List<T> nodes) {
        if(null == nodes || nodes.size() == 0) return null;

        Map<Integer, T> resources = new HashMap<Integer, T>();
        List<T> result = new ArrayList<T>();

        try {
            for(int i=0; i<nodes.size(); i++) {
                T node = nodes.get(i);
                Method getId = node.getClass().getMethod("getId");
                Integer id = (Integer) getId.invoke(node);
                resources.put(id, node);
            }

            for (Map.Entry<Integer, T> e : resources.entrySet()) {
                T node = e.getValue();
                Method getparentId = node.getClass().getMethod("getParentId");
                Integer parentId = (Integer) getparentId.invoke(node);
                if(parentId == 0) {
                    result.add(node);
                } else {
                    T parent = resources.get(parentId);
                    if( null != parent) {
                        @SuppressWarnings("unchecked")
                        List<T> children = (List<T>) parent.getClass().getMethod("getChildren").invoke(parent);
                        children.add(node);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

3.数据库记录。

4.ExtJS前端代码。

Ext.onReady(function() {
    var store = Ext.create(‘Ext.data.TreeStore‘, {
        proxy: {
            type: ‘ajax‘,
            url: ‘your url‘
        },
        root: {
            text: ‘系统菜单‘,
            id: 0,
            expanded: true
        }
    });
    var treePanel = Ext.create(‘Ext.tree.Panel‘, {
        title: ‘树形菜单‘,
        width: 300,
        height: 350,
        margin: ‘50 0 0 500‘,
        store: store,
        rootVisible: false,
        useArrows: true,
        renderTo: Ext.getBody()
    });
});

5.效果图。

6.完毕。

时间: 2024-08-14 17:40:30

ExtJS4.2 根据数据库记录构建树形菜单的相关文章

Java构建树形菜单

构建树形菜单 效果图:支持多级菜单. 菜单实体类: public class Menu { // 菜单id private String id; // 菜单名称 private String name; // 父菜单id private String parentId; // 菜单url private String url; // 菜单图标 private String icon; // 菜单顺序 private int order; // 子菜单 private List<Menu> ch

使用zTree插件构建树形菜单

zTree下载:https://github.com/zTree/zTree_v3 目录: 就我看来,zTree较为实用的有以下几点: zTree 是一个依靠 jQuery 实现的多功能 “树插件”.优异的性能.灵活的配置.多种功能的组合是 zTree 最大优点. 支持 JSON 数据 支持静态 和 Ajax 异步加载节点数据 支持任意更换皮肤 / 自定义图标 支持极其灵活的 checkbox 或 radio 选择功能 提供多种事件响应回调 灵活的编辑(增/删/改/查)功能,可随意拖拽节点,还可

Java从数据库读取页面树形菜单

从数据库加载菜单及子菜单主要使用递归的方法,具体实现可看代码 首先封装一个菜单pojo public class Menu { // 菜单id private String id; // 菜单名称 private String name; // 父菜单id private String parentId; // 菜单url private String url; // 菜单图标 private String icon; // 菜单顺序 private int order; // 子菜单 priv

构建树形菜单数据

菜单实体: @Data public class SysMenu { /** * 菜单编码 */ @ApiModelProperty(value="菜单编码",name="rowId",example="菜单编码") private String rowId; /** * 菜单名称 */ @ApiModelProperty(value="菜单名称",name="name",example="菜单名

[JavaScritp]构建简单的json树形菜单

json结构: var Menu = [{ tit:"一级菜单", submenu:[{ tit:"二级菜单", url:"", func:function(){ alert('what do you want to do?'); } },{ tit:"二级菜单", func:function(){ alert('do what?'); }, submenu:[{ tit:"三级菜单", url:"

ExtJs Treepanel刷新树形菜单

在之前的一次项目开发学习过程中,我需要实现一个功能,就是点击导航栏的链接后左侧树形菜单自动生成对应的菜单项.当时这个问题困扰了我很长一段时间. 后来,在看了ExtJs官方的文档及Demo后一下恍然大悟. 我们来认真分析一下要实现这个功能就是让树形菜单整个刷新. 首先来看看官方的Demo里面是怎么写的: 后台Default.aspx.cs文件中的关键代码:    [DirectMethod]     public string RefreshMenu()     {         Ext.Net

zTree 从数据库中动态加载树形菜单

这几天做动态菜单用到了这个插件,目前用的很广泛的一个开源框架,最新发布的QUI框架就是用这个插件开发的菜单部分,因此还是很值得深入研究和学习,通过使用感觉功能很丰富,好多函数不用自己开发和编写,官网上有很详尽的API可以参考,用着算顺手但学习使用的过程中也遇到了一些困难,听过反复测试和查资料都理解了,但也在思考一个问题,怎么样才能使得最快的时间从接触一个新东西到灵活掌握的程度? 这个不仅仅是一个树形结构的菜单,每个节点左边可以有一个复选框,看了看也挺简单的,只需要在setting里面配置一个ch

c#从数据库读取数据动态生成树形菜单

页面: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebTree.aspx.cs" Inherits="Tree.WebTree" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/

利用多叉树实现Ext JS中的无限级树形菜单(一种构建多级有序树形结构JSON的方法)

一.问题研究的背景和意义 目前在Web应用程序开发领域,Ext JS框架已经逐渐被广泛使用,它是富客户端开发中出类拔萃的框架之一.在Ext的UI控件中,树形控件无疑是最为常用的控件之一,它用来实现树形结构的菜单.TreeNode用来实现静态的树形菜单,AsyncTreeNode用来实现动态的异步加载树形菜单,后者最为常用,它通过接收服务器端返回来的JSON格式的数据,动态生成树形菜单节点.动态生成树有两种思路:一种是一次性生成全部树节点,另一种是逐级加载树节点(利用AJAX,每次点击节点时查询下