一直想弄个同步树,查阅相关资料开始动手写个,借鉴了相关资料,基本功能满足. 开始不知道这个Ext.tree.TreeCheckNodeUI 这个扩展的组件有什么作用,源码看不懂, 于是自己实现带有复选框的树以及父节点和子节点级联,就是在treepanel加个checkchange事件即可 listeners: { 'checkchange': function (node, checked) { if (node.parentNode && node.parentNode.getUI().checkbox != null) { checkParentFun(node.parentNode); } ChildTreeNodeFun(node, checked); } }, 具体实现用的是checkParentFun(node.parentNode),ChildTreeNodeFun(node, checked); 两个JS函数 Ext.tree.TreeCheckNodeUI 后来貌似懂了这个扩展的插件式干嘛的了,于是去除了监听事件, 不过感觉还是用这个扩展的插件和监听事件相结合使用才完美,具体的动手试试就知道了,粗略代码如下: 基本是通用的,尤其是对于权限管理中,角色和菜单之间的关联很实用 Ext.onReady(function() { Ext.QuickTips.init(); this.tree = new Ext.tree.TreePanel({ id:'tree', region: 'center', autoScroll: true, animate: true, width: '280', collapsible: (this.centerRegion=='center' ? false : true), split: true, tbar: [{xtype:"button",text:"logout",listeners:{ "click":function(){ssd(); }} }], enableDD: true, checkModel: 'cascade', //对树的级联多选 onlyLeafCheckable: false,//对树所有结点都可选 containerScroll: true, border: false, loader: new Ext.tree.TreeLoader({ url:'/neFunction/test', baseAttrs: { uiProvider: Ext.tree.TreeCheckNodeUI }//解决了获取树节点的级联多选问题 }), root: new Ext.tree.AsyncTreeNode({ id: "0", level: "0", text:"菜单树" }), // listeners: { // 'checkchange': function (node, checked) { // if (node.parentNode && node.parentNode.getUI().checkbox != null) { // checkParentFun(node.parentNode); // } // ChildTreeNodeFun(node, checked); // } // }, rootVisible: true }); this.tree.getRootNode().expand(); this.tree.addListener("click",this.ClickNode); this.contextMenu = new Ext.menu.Menu({ id:"treeContextMenu", items:[ { text:"查看", handler:function() { Ext.Msg.alert("...",Ext.getCmp('tree').getSelectionModel().getSelectedNode().id); } } ] }); this.tree.on("contextmenu",function(node,e) { e.preventDefault(); // 阻止弹出默认右键菜单 node.select(); // 选中节点 Ext.getCmp("treeContextMenu").showAt(e.getXY()); }); new Ext.Viewport({ renderTo:Ext.getBody(), layout : 'border', autoShow:true, items: [this.tree] }); }); function ClickNode(node){ console.info(node.attributes.id); } /** 父节点的选择 */ function checkParentFun (treeNode) { var i; var check = false; var nocheck = false; if (treeNode.hasChildNodes()) { for (i = 0; i < treeNode.childNodes.length; i++) { if (treeNode.childNodes[i].getUI().checkbox.checked) { check = true; } else { nocheck = true; } } } if (check == true && nocheck == false) { // 可以全选 treeNode.getUI().checkbox.checked = true; } else if (check == true && nocheck == true) { // 半选 孩子节点既有选中的也有未选中的 这种情况则父节点还是选中 treeNode.getUI().checkbox.checked = true; // treeNode.ui.toggleCheck(true); if(treeNode.parentNode&& treeNode.parentNode.getUI().checkbox != null){ checkParentFun(treeNode.parentNode); } } else if (check == false && nocheck == true) { // 全不选 孩子节点都是未选中的则父节点取消选中 treeNode.getUI().checkbox.checked = false; //treeNode.ui.toggleCheck(false); treeNode.collapse();//父节点收缩 if(treeNode.parentNode&& treeNode.parentNode.getUI().checkbox != null){ checkParentFun(treeNode.parentNode); } } }; /** 孩子节点的选择 */ function ChildTreeNodeFun (treeNode,checked) { var i; checked ? treeNode.expand() : treeNode.collapse();//点击某一节点让子节点都展开全部展开 if (treeNode.hasChildNodes()) { for (i = 0; i < treeNode.childNodes.length; i++) { if (treeNode.childNodes[i].getUI().checkbox) { treeNode.childNodes[i].getUI().checkbox.checked = checked; // treeNode.childNodes[i].ui.toggleCheck(checked); ChildTreeNodeFun(treeNode.childNodes[i],checked); } } } }; /** 根据路径对于节点的选择以及获取选中的节点 */ function ssd(){ tree.expandPath("/0/201/401/511");// var treeNode = Ext.getCmp("tree").getNodeById("511"); if (treeNode) { treeNode.getUI().checkbox.checked = true; } var checkedNodes = Ext.getCmp("tree").getChecked(); var s = []; for (var i = 0; i < checkedNodes.length; i++) { s.push(checkedNodes[i].text); } alert(s); }
后台代码 Tree这个类 对应extjs Ext.tree.TreeNode public class Tree implements Serializable { private static final long serialVersionUID = 1L; private String id; private String text; private String iconCls; private boolean expanded; private boolean leaf; private String url; private List<Tree> children; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getText() { return text; } public void setText(String text) { this.text = text; } public String getIconCls() { return iconCls; } public void setIconCls(String iconCls) { this.iconCls = iconCls; } public boolean isExpanded() { return expanded; } public void setExpanded(boolean expanded) { this.expanded = expanded; } public boolean isLeaf() { return leaf; } public void setLeaf(boolean leaf) { this.leaf = leaf; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public List<Tree> getChildren() { return children; } public void setChildren(List<Tree> children) { this.children = children; } }
package cn.com.starit.web.util; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import cn.com.starit.web.model.Menu; /*生成树JSON数组的类*/ public class TreeMenu { private List<Menu> list; private Menu root; public TreeMenu(List<Menu> list) { this.list = list; this.root = new Menu(); } /** * 组合json * * @param list * @param node */ private Tree getNodeJson(List<Menu> list, Menu node) { Tree tree = new Tree(); tree.setId("_authority_" + node.getId()); tree.setText(node.getName()); System.out.println(node.getName()); tree.setChildren(new ArrayList<Tree>()); if (list == null) { // 防止没有权限菜单时 return tree; } if (hasChild(list, node)) { List<Tree> lt = new ArrayList<Tree>(); tree.setLeaf(false); List<Menu> childList = getChildList(list, node); Iterator<Menu> it = childList.iterator(); while (it.hasNext()) { Menu modules = (Menu) it.next(); // 递归 lt.add(getNodeJson(list, modules)); } tree.setChildren(lt); } else { tree.setLeaf(true); } return tree; } /** * 判断是否有子节点 */ private boolean hasChild(List<Menu> list, Menu node) { return getChildList(list, node).size() > 0 ? true : false; } /** * 得到子节点列表 */ private List<Menu> getChildList(List<Menu> list, Menu modules) { List<Menu> li = new ArrayList<Menu>(); Iterator<Menu> it = list.iterator(); while (it.hasNext()) { Menu temp = (Menu) it.next(); if (temp.getParentId() == modules.getId()) { li.add(temp); } } return li; } public Tree getTreeJson() { // 父菜单的id为0 this.root.setId(0L); this.root.setName("根节点"); this.root.setIsLeaf("N"); return this.getNodeJson(this.list, this.root); } }
请求访问的controler层 @RequestMapping("/test") @ResponseBody public List<Tree> getTestInfoList() { List<Menu> list = testService.getMenuList(); //list为获取后台的菜单信息 TreeMenu menu = new TreeMenu(list); Tree tree = menu.getTreeJson(); return tree.getChildren(); } }
相关推荐
《基于Extjs、SpringMVC和MyBatis的财务管控系统构建详解》 在现代企业信息化建设中,财务管控系统的构建至关重要,它能够帮助企业高效管理财务数据,提高运营效率,确保财务安全。本文将深入探讨如何利用Extjs、...
《基于Extjs+Mysql+SpringMVC+MyBatis的通用后台管理系统详解》 在当前信息化社会中,后台管理系统是企业管理与运营的核心工具之一。本文将深入探讨一个使用Extjs作为前端框架,Mysql作为数据库,SpringMVC作为控制...
标题 "extjs+springmvc+dubbo+mybatis+oracle" 描述了一个综合性的企业级Web应用架构,结合了前端、后端服务以及数据库技术。这个架构由以下几部分组成: 1. **ExtJS**:这是一个JavaScript库,用于构建富客户端...
标题直接点明了文章的主题,即在ExtJS框架中实现带有复选框功能的树形结构。这种类型的树形结构在许多场景下都非常有用,比如权限管理、多级分类管理等,它允许用户选择或取消选择树中的节点,从而实现对数据的多选...
"带复选框的树"是ExtJS中的TreePanel组件的一个扩展,允许用户通过复选框选择树结构中的节点。这种功能在数据层级结构的管理和筛选中非常有用,例如在组织架构、文件系统或者权限设置中。 复选框树的核心在于`...
使用extjs+ibatis+spring+struts开发的权限系统 数据库mysql 数据库文件在开发文档目录下 动态树形菜单的加载 ,用户角色权限菜单的维护 jar文件删了一些,需要用的自己加包
SpringMVC+ExtJS4.2是Web开发中一种经典的前后端组合,它们共同构建了高效、用户友好的企业级应用程序。在这个项目中,我们主要关注如何利用这两个框架实现用户管理的基本操作,包括增、删、改、查(CRUD)功能。 ...
基于 Extjs + spring + hibernate 的OA框架 基于 Extjs + spring + hibernate 的OA框架 基于 Extjs + spring + hibernate 的OA框架
- `extjs复选框树.js`:这是实现上述功能的JavaScript代码,包括工具类和针对树节点的操作方法。 - `样式文件.css`:可能包含了一些自定义的样式,用于美化复选框和树的显示效果。 - `示例HTML文件.html`:演示如何...
标题“extjs3+springMVC上传文件”指的是使用ExtJS 3版本的JavaScript库与Spring MVC框架结合实现文件上传功能。这篇博文可能是作者在ITEYE博客上分享的一个技术实践,遗憾的是,描述部分为空,没有提供额外的信息。...
extjs视频教程,基于spring+springMvc+mybatis框架开发,适合初学者,跟着视频教程入门
基于EXTjs 的 动态复选框树 json数据交互
【SpringMVC】 SpringMVC是Spring框架的一部分,它是一个用于构建Web应用程序的轻量级、模型-视图-控制器(MVC)架构。SpringMVC通过将业务逻辑、控制逻辑和显示逻辑分离,提高了代码的可维护性和可测试性。在...
通用后台管理系统(ExtJS4.2+Hibernate4.1.7+SpringMVC3.2.8).pdf
全选功能通常通过添加一个特殊的复选框来实现,该复选框与所有其他复选框的状态联动,当所有项被选中时,全选复选框自动选中;反之,当至少有一项未被选中时,全选复选框应该变为未选中状态。 问题的根源在于事件...
在这个"extjs4.1下拉复选框完整DEMO"中,我们主要关注的是如何使用ExtJS实现一个具有动态加载功能的下拉复选框组件。这个DEMO包含以下几个关键组成部分: 1. **ext-all-debug.js**:这是ExtJS的核心库文件,包含了...
本实例为ExtJS4.2.1 MVC 和 SpringMVC3.0.5 基于注解模式下的开发实例,是桌面型的应用程序,包含全部需要的jar包,定义了项目的基于架构和实现,可在MyEclipse10打开和部署,对于有需要在该环境下进行开发的人员,...
ExtJS是一个流行的JavaScript框架,它提供了大量的可重用组件,如表格、图表、树形视图、窗体等,使得开发者可以快速构建出响应式、富交互性的前端应用。其MVC(Model-View-Controller)架构支持模块化开发,便于...
2. 表单系统:FormPanel组件提供了丰富的表单元素,如文本框、下拉框、复选框等,可轻松构建复杂表单,结合数据绑定,实现动态表单验证和提交。 3. 图标和工具栏:提供了一系列图标资源和Toolbar组件,可以创建各种...
extjs+asp+access 实例, 用IIS 即可立即调试 详细请看里面说明 同时,打包文件有个extjs3.0的javascript包,里面有个example文件夹,很多都可以copy过来改成自己的代码