`
gtgt1988
  • 浏览: 114261 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

extjs+springmvc实现带有复选框树的级联 (treepanel使用)

 
阅读更多
一直想弄个同步树,查阅相关资料开始动手写个,借鉴了相关资料,基本功能满足.
开始不知道这个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();

	}

}

 

 

  • 大小: 6.7 KB
分享到:
评论

相关推荐

    Extjs+SpringMVC+MyBaits财务管控系统

    《基于Extjs、SpringMVC和MyBatis的财务管控系统构建详解》 在现代企业信息化建设中,财务管控系统的构建至关重要,它能够帮助企业高效管理财务数据,提高运营效率,确保财务安全。本文将深入探讨如何利用Extjs、...

    Extjs+Mysql+SpringMVC+MyBatis通用后台管理系统

    《基于Extjs+Mysql+SpringMVC+MyBatis的通用后台管理系统详解》 在当前信息化社会中,后台管理系统是企业管理与运营的核心工具之一。本文将深入探讨一个使用Extjs作为前端框架,Mysql作为数据库,SpringMVC作为控制...

    extjs+springmvc+dubbo+mybatis+oracle

    标题 "extjs+springmvc+dubbo+mybatis+oracle" 描述了一个综合性的企业级Web应用架构,结合了前端、后端服务以及数据库技术。这个架构由以下几部分组成: 1. **ExtJS**:这是一个JavaScript库,用于构建富客户端...

    带复选框的 ExtJs tree

    标题直接点明了文章的主题,即在ExtJS框架中实现带有复选框功能的树形结构。这种类型的树形结构在许多场景下都非常有用,比如权限管理、多级分类管理等,它允许用户选择或取消选择树中的节点,从而实现对数据的多选...

    extjs3.X 带复选框的树

    "带复选框的树"是ExtJS中的TreePanel组件的一个扩展,允许用户通过复选框选择树结构中的节点。这种功能在数据层级结构的管理和筛选中非常有用,例如在组织架构、文件系统或者权限设置中。 复选框树的核心在于`...

    extjs开发的权限系统(树形菜单复选框可级联选择)

    使用extjs+ibatis+spring+struts开发的权限系统 数据库mysql 数据库文件在开发文档目录下 动态树形菜单的加载 ,用户角色权限菜单的维护 jar文件删了一些,需要用的自己加包

    springMVC+Extjs4.2实现用户增删改查功能

    SpringMVC+ExtJS4.2是Web开发中一种经典的前后端组合,它们共同构建了高效、用户友好的企业级应用程序。在这个项目中,我们主要关注如何利用这两个框架实现用户管理的基本操作,包括增、删、改、查(CRUD)功能。 ...

    基于 Extjs + spring + hibernate 的OA框架

    基于 Extjs + spring + hibernate 的OA框架 基于 Extjs + spring + hibernate 的OA框架 基于 Extjs + spring + hibernate 的OA框架

    extjs带复选框的树包括全选 反选 子选父以及 父选子

    - `extjs复选框树.js`:这是实现上述功能的JavaScript代码,包括工具类和针对树节点的操作方法。 - `样式文件.css`:可能包含了一些自定义的样式,用于美化复选框和树的显示效果。 - `示例HTML文件.html`:演示如何...

    extjs3+springMVC上传文件

    标题“extjs3+springMVC上传文件”指的是使用ExtJS 3版本的JavaScript库与Spring MVC框架结合实现文件上传功能。这篇博文可能是作者在ITEYE博客上分享的一个技术实践,遗憾的是,描述部分为空,没有提供额外的信息。...

    extjs教程.txt基于spring+springMvc+mybatis框架开发

    extjs视频教程,基于spring+springMvc+mybatis框架开发,适合初学者,跟着视频教程入门

    基于EXTjs 的 动态复选框树

    基于EXTjs 的 动态复选框树 json数据交互

    SpringMVC+Hibernate+EXT

    【SpringMVC】 SpringMVC是Spring框架的一部分,它是一个用于构建Web应用程序的轻量级、模型-视图-控制器(MVC)架构。SpringMVC通过将业务逻辑、控制逻辑和显示逻辑分离,提高了代码的可维护性和可测试性。在...

    通用后台管理系统(ExtJS4.2+Hibernate4.1.7+SpringMVC3.2.8).pdf

    通用后台管理系统(ExtJS4.2+Hibernate4.1.7+SpringMVC3.2.8).pdf

    解决Extjs当中复选框全选后,取消选中某一项,全选框仍是选中状态的问题

    全选功能通常通过添加一个特殊的复选框来实现,该复选框与所有其他复选框的状态联动,当所有项被选中时,全选复选框自动选中;反之,当至少有一项未被选中时,全选复选框应该变为未选中状态。 问题的根源在于事件...

    extjs4.1下拉复选框完整DEMO

    在这个"extjs4.1下拉复选框完整DEMO"中,我们主要关注的是如何使用ExtJS实现一个具有动态加载功能的下拉复选框组件。这个DEMO包含以下几个关键组成部分: 1. **ext-all-debug.js**:这是ExtJS的核心库文件,包含了...

    桌面型ExtJS4.2.1MVC+SpringMVC3.0.5注解开发实例

    本实例为ExtJS4.2.1 MVC 和 SpringMVC3.0.5 基于注解模式下的开发实例,是桌面型的应用程序,包含全部需要的jar包,定义了项目的基于架构和实现,可在MyEclipse10打开和部署,对于有需要在该环境下进行开发的人员,...

    Extjs+ASP.net 后台管理框架

    ExtJS是一个流行的JavaScript框架,它提供了大量的可重用组件,如表格、图表、树形视图、窗体等,使得开发者可以快速构建出响应式、富交互性的前端应用。其MVC(Model-View-Controller)架构支持模块化开发,便于...

    ExtJS+2.2实现及应用连载.rar

    2. 表单系统:FormPanel组件提供了丰富的表单元素,如文本框、下拉框、复选框等,可轻松构建复杂表单,结合数据绑定,实现动态表单验证和提交。 3. 图标和工具栏:提供了一系列图标资源和Toolbar组件,可以创建各种...

    extjs+asp+access 实例

    extjs+asp+access 实例, 用IIS 即可立即调试 详细请看里面说明 同时,打包文件有个extjs3.0的javascript包,里面有个example文件夹,很多都可以copy过来改成自己的代码

Global site tag (gtag.js) - Google Analytics