资源描述:
《基于内存多叉树的ext js无限级树形菜单实现方案》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、基于内存多叉树的ExtJS无限级树形菜单实现方案(版权所有:北京宇信易诚科技有限公司网上银行事业部)一、论文研究的背景和意义目前在Web应用程序开发领域,ExtJS框架已经逐渐被广泛使用,它是富客户端开发中出类拔萃的框架之一。在Ext的UI控件中,树形控件无疑是最为常用的控件之一,它用来实现树形结构的菜单。TreeNode用来实现静态的树形菜单,AsyncTreeNode用来实现动态的异步加载树形菜单,后者最为常用,它通过接收服务器端返回来的JSON格式的数据,动态生成树形菜单节点。生成树有两种思路,一种是一次性生成全部树节点,另一种是异步加载树节点(bra
2、nch-by-branch)。对于大数据量的菜单节点来说,异步加载是比较合适的选择,但是对于小数据量的菜单来说,一次性生成全部节点应该是最为合理的方案,在实际应用开发中,一般不会遇到特别大数据量的场景,所以一次性生成全部菜单节点是我们重点研究的技术点,本文就是介绍基于ExtJS的应用系统中如何将数据库中的无限级层次数据一次性在界面中生成全部菜单节点(例如在界面中以树形方式一次性展示出银行所有分支机构的信息)。解决ExtJS无限级树形菜单的问题,可以拓展出更多的应用场景,例如BI(商业智能)系统中的报表分析中的数据钻取功能,也就是多级数据列表的展示;或者可以利
3、用本文的思路扩展出其他的更复杂的应用场景。二、详细设计方案让我们先看一段代码片段:文件一,branchTree.html(Ext树形控件页面)Ext.onReady(function(){vartree=newExt.tree.TreePanel({height:300,width:400,animate:true,enableDD:true,containerScroll:true,rootVisible:false,frame:true,loader:newExt.tree.TreeLoader({dataUrl:'getBranch.do'}),//g
4、etBranch.do请求服务器返回无限级的JSON字符串root:newExt.tree.AsyncTreeNode({id:'0',text:'根结点'})});tree.expandAll();});文件二,branchTreeJSON.jsp(接收getBranch.do请求,返回无限级JSON字符串)<%//读取银行分支机构的层次数据Listresult=DataAccess.getResultList();//将层次数据转换为内存多叉树对象(本文下面会详细介绍该数据结构的实现方法)Noderoot=ExtTreeHelper.createExtT
5、ree(result);%>[<%=root.toString()%>]以上两个程序文件是一次性生成无限级树形菜单所必须的,其中最为关键的部分就是如何生成一个无限级的JSON字符串,返回给客户端的Ext树形控件。对于银行分支机构来说,需要返回类似如下的JSON串:{id:'100000',text:'廊坊银行总行',children:[{id:'110000',text:'廊坊分行',children:[{id:'113000',text:'廊坊银行开发
6、区支行',leaf:true},{id:'111000',text:'廊坊银行金光道支行',leaf:true},{id:'112000',text:'廊坊银行解放道支行',children:[{id:'112200',text:'廊坊银行三大街支行',leaf:true},{id:'112100',text:'廊坊银行广阳道支行',leaf:true}]}]}]}同时还可能需要对树中每一个层次的节点按照某一属性(比如分支机构编号)进行排序,以展示出有序的树形菜单。现在可以把问题概括为:1、把层次数据转换成JSON格式的字符串2、对树中每一个层次的节点按照某
7、一属性(比如分支机构编号)进行排序下面介绍解决问题的思路:在数据结构这门课中,我们都学过二叉树和B树,二叉树属于内存数据结构,B树属于外存数据结构,我们的问题只涉及到内存操作,所以和B树无关,但是无限级树形菜单无法用二叉树来表示,因为每个节点下面都会有多个子节点,所以需要设计一种新的数据结构,用来表示这种多叉树结构,同时还要实现横向排序,即对隶属于同一个父节点下面的所有直接子节点按照某一节点属性和规则进行排序,保持兄弟节点横向有序。如图所示:这棵树构造好之后,就可以通过纵向遍历(深度遍历)递归打印出无限级JSON字符串了。为了区别它和B树(一种外存多叉树),
8、可以称它为内存多叉树。概括起来分为三步:1、构造无序