`
lixw
  • 浏览: 200956 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Ext Tree使用笔记

阅读更多

      最近做项目对Ext Tree做了一些简单应用,进行一个简单总结,与大家分享。

之前使用dTree,这个JS短小精悍,功能也不逊色,特别是它的cookie记录功能,让我们省了不少的事,不过缺点就是不支持异步查询。后来转换到了Ext Tree上。下面是一些应用场景和总结。欢迎大家指导。

 

1、同步树:

     创建TreePanel,设置属性,添加一个根节点,并展开树。

var Tree = Ext.tree;
var tree = new Tree.TreePanel({   
      el:'treeDiv',   
      autoScroll:true,
      autoHeight:true,
      animate:true,
      enableDD:true,
      loader: new Tree.TreeLoader({
	    dataUrl:'tree.do'   
      })
});   

// set the root node   
var root=new Ext.tree.TreeNode({
   id : "root",
   text : "操作列表"
});

tree.setRootNode(root);
	
// render the tree
tree.render();
root.expand();
root.select();

 

2、异步树:

    为同步树树添加异步子节点,并指定其连接地址。

node.on('expand', getSubTree);

    指定展开节点时如何触发异步查询

 

function appendToRoot(root, n){	 
    var roots = document.getElementsByName(n.id);
    //alert(roots.length);
    if(roots != null){
    	for(var i = 0; i < roots.length; i++){
    		var rr = roots[i].value;
    		if(rr == null || rr.length == 0){
    			continue;
    		}
    		//alert(rr);
    		var id_ = rr.split(",")[0];
    		var text_ = rr.split(",")[1];
	    	var node = null;		    
		var hasChild = rr.split(",")[2];
		var isLeaf = (hasChild == "true") ? false : true;
		node = new Ext.tree.AsyncTreeNode({
			id: id_,
			text : text_,
			href : "Handle.do?id=" + id_ ,
		        hrefTarget : "main",
		        leaf : isLeaf,
			children : [{
			       text : 'loading',
			       iconCls : 'loading',
			       leaf : false
			}]
		});
			    
		node.on('expand', getSubTree);		    
			
		root.appendChild(node);
    	}
    }	    
}

      异步查找子节点。

function getSubTree(node){
	if(node.firstChild.text=='loading'){
		Ext.Ajax.request({
			url: 'tree.do',
			params: {node : node.id},
			method: 'POST',
			timeout: 60*1000, //1分钟
			success: function(v){
				//成功返回
				var myData = eval(v.responseText); // 得到服务器返回的json串 
				if(v.responseText == null || myData.length == 0){				
					node.firstChild.remove();
					return;
				}
				
				for(var i = 0; i < myData.length; i++){
					var cnode = new Ext.tree.AsyncTreeNode({
						id : myData[i].id,
						text : myData[i].text,
						leaf : myData[i].isLeaf,
						href : "Handle.do?id=" + myData[i].id,
						hrefTarget : TARGET,
						children : [{
                  //添加子节点,如果服务器返回tl[i].leaf为true则孩子节点将无法显示
							text : 'loading',
							iconCls: 'loading',
							leaf:true
						}]
					});
					
					cnode.on('expand',getSubTree);					
					node.appendChild(cnode);
				}
				node.firstChild.remove();//删除当前节点第一个孩子节点(loading节点)
			},
			// 失败
			failure: function(){
				alert("获取子节点出错");
			}
		});
	} 
}

      服务器端的代码片段:

	public List<Map<String, Object>> getSubTree(String id, String type) {
		try {
			List<Map<String, Object>> retList = new ArrayList<Map<String, Object>>();
			List<ChnTreeNode> list = getManage().getRankingManage().getChilds(id);			
			for(ChnTreeNode node : list) {				
				Map<String, Object> tree = new HashMap<String, Object>();
				String nodeType = node.getType();
				
				if(filterNode(nodeType, type)){
					continue;
				}
				//节点的id    
				tree.put("id", node.getId());
				//节点显示单位名              
				tree.put("text", node.getText());
				//是否是叶子节点  
				tree.put("isLeaf", Boolean.valueOf(node.isLeaf()));
				//类型
				tree.put("type", nodeType);
				//将这个生成叶子节点对应的MAP加到单位list里   
				retList.add(tree);
			}
			return retList;
		} catch (Exception e) {
			log.error("获取子节点列表失败:" + e.getMessage());
			return null;
		}
	}

	public static boolean filterNode(String nodeType, String type) {
		if("1".equals(type)){
			return false;
		}else{
			int type_ = Integer.parseInt(type);
			if(nodeType.substring(type_-2, type_-1).equals("1")){
				return false;
			}else{
				return true;
			}
		}
	}

	public JSONArray getModuleTree(String id, String type) {
		List<Map<String, Object>> list = this.getSubTree(id, type);
		if (list == null) {
			return null;
		}
		//转换这个list让他变成json格式       
		JSONArray jsonArray = JSONArray.fromObject(list);
		return jsonArray;
	}

	public ActionForward tree(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		String id = request.getParameter("node");
		String type = request.getParameter("filter");
		
		JSONArray jsonArray = getModuleTree(id, type);
		response.setContentType("text/json; charset=GBK");
		try {
			response.getWriter().print(jsonArray);
		} catch (IOException e) {
			log.error("输出json失败" + e.getMessage());
			return null;
		}

		return null;
	}

 

3、自定义节点属性:

      从2中的服务器端代码看到我们自定义了type属性,这样返回的JSON字符串,就可以获得这个属性设置到树的TreeNode中,那么我们如何取得这个属性呢,可以用这样的代码:

node.attributes.type 

4、复选框支持:

      经常有这样的应用场景,就是我们的树节点是支持多选的,这时候我们可以为树节点添加checked属性,监听复选事件,可以用下面的代码:

node.on('checkchange', checkChange);
...

function checkChange(node, checked){
	//node.expand();
	node.attributes.checked = checked;
	node.eachChild(function(child) {     
		child.ui.toggleCheck(checked);     
		child.attributes.checked = checked;
		child.fireEvent('checkchange', child, checked);     
	});
}

     上面的操作还能够实现点选父节点时,将所有它的子节点也选择。如何获得复选框的值呢,请看5.

 

5、递归取值:

     下面的方法是采用递归函数的方式遍历整个节点子树,将所有值保存到了Array中,不知Ext Tree有没有提供这样的功能,如果有,请大家一定要告诉我,谢谢!

function handleSelect(node, chnIds){
	if(node.attributes.checked){
		if(!contains(chnIds, node.id)){
			chnIds.push(node.id);
		}
		return;
	}else{
		node.eachChild(function(child) {
			handleSelect(child, chnIds);    
		});
	}
} 

 

6、remove的问题:

      先看一段代码:

var children = root.childNodes;
for(var i = 0; i < children.length; i++){
     root.removeChild(children[i]);
}

      如果使用上面的代码,我们会发现删除总是会出现逻辑问题,最开始我也很是疑惑,明明length为3,为什么只执行两次呢,原来是删除的同时,root节点孩子的数目和每个孩子所处的下标都是变化的,我们可以用这段代码来代替:

while(root.firstChild){
     root.removeChild(root.firstChild);
} 

 

7、TreeFilter的应用:

      TreeFilter可以实现按条件过滤的功能,树的节点在展示的时候,会考虑TreeFilter的过滤来决定显示那些节点,隐藏那些节点,它的用法很简单:

var filter = new Ext.tree.TreeFilter(tree, {
    clearBlank: true,
    autoClear: true
});

filter.filterBy(function(n){
    if(n.id.substring(0, 1) == "N"){
         return false;
    }else{
         return true;
    }
});

      上面的代码会过滤掉所有id以字母N开头的节点。

 

8、注意事项:

      对于异步树节点,如果不同节点可能来自不同数据表的时候,如果我们利用表的主键做ID,我们要防止节点的ID重复,可以在在取得的主键ID前面增加字符串做标识,后台再截取。

 

9、问题:

     点击历史的记录,这个对于异步树有点难度,大家是怎么做的呢?

     对节点的页面级的缓存

 

参考:

http://beckrabbit.iteye.com/blog/132995

http://kingapex.iteye.com/blog/150806

http://www.iteye.com/topic/133269

http://www.easyjf.com/bbs.ejf?cmd=appShow&id=5734416

http://jstang.5d6d.com/thread-844-1-1.html

分享到:
评论
6 楼 lixw 2009-10-30  
hbkjdx205 写道
在这个方法public List<Map<String, Object>> getSubTree(String id, String type) 中下面一行是什么意思,特别是ChnTreeNode 是自定义的类型吗?

        List<ChnTreeNode> list = getManage().getRankingManage().getChilds(id);


ChnTreeNode 是自定义的类型,对树节点的一个封装,下面的代码是从数据库获取子节点列表,这个你可以由你的应用来决定。
5 楼 hbkjdx205 2009-10-26  
在这个方法public List<Map<String, Object>> getSubTree(String id, String type) 中下面一行是什么意思,特别是ChnTreeNode 是自定义的类型吗?

        List<ChnTreeNode> list = getManage().getRankingManage().getChilds(id);
4 楼 lixw 2009-07-16  
TheMatrix 写道
能提供源码吗?

您好,我的代码特别凌乱,也不好提供,怕有误人之嫌,我建议你可以参考一下Ext2.0.2发布包中examples\tree目录的例子,其中reorder.js就是一个异步树的例子,谢谢。
3 楼 TheMatrix 2009-07-14  
能提供源码吗?
2 楼 lixw 2008-12-10  
weiruan85 写道

很好,很强大,收藏了先

谢谢关注!
1 楼 weiruan85 2008-12-10  
很好,很强大,收藏了先

相关推荐

    ext tree json 例子(不含EXT包)

    "ext tree json 例子(不含EXT包)"这个标题暗示我们将讨论如何在不直接引用EXT完整包的情况下,仅使用EXT JS中关于TreePanel和JSON解析的部分来构建一个动态的树形结构。这可能涉及到手动引入EXT的核心组件,如...

    Ext学习笔记

    Ext JS4学习教程+笔记(一) Ext JS4学习教程+笔记(二)事件处理 ...Ext JS4学习教程+笔记(七)树面板Tree Panel Ext JS4学习教程+笔记(三)Ajax请求 Ext JS4学习教程+笔记(五)Form Panel的使用 Ext学习网址

    Ext学习笔记-个人版.doc

    对于动态树型结构,`Ext.tree.AsyncTreeNode`扮演着重要角色。如果一个节点没有`leaf:true`属性,那么当用户展开该节点时,Ext会通过树面板(`treepanel`)的加载器去向服务器请求数据,通常用于动态加载子节点。请求...

    对初学者有帮助的Ext笔记

    这篇文档是针对初学者的Ext学习笔记,涵盖了JavaScript、CSS、数据库权限管理、JSP编码问题以及Flex/MXML等多个IT领域的基础知识。以下是这些知识点的详细解释: 1. JavaScript中的`replaceAll`方法:在JavaScript...

    DotNet+Ext入门

    本篇文章主要探讨的是如何将这两者结合使用,特别是 Ext 中的 Store 和 GridPanel 控件及其属性,以及 Coolite 中的 Ext 部分控件应用。 首先,我们来了解下 ExtJs 的结构树。ExtJs 是一个组件化的框架,它的结构...

    ExtJS使用笔记

    Ext.tree.TreePanel组件用于展示树状结构的数据,可以构建静态的树结构,也可以动态地从服务器加载数据构建树。TreePanel提供了丰富的方法和事件,以便于操作和交互。 最后,ExtJS中的Menu、Button和Toolbar组件...

    Extjs复习笔记(十九)-- XML作为tree的数据源

    var treePanel = Ext.create('Ext.tree.Panel', { title: 'XML Tree', store: store, rootVisible: true, renderTo: Ext.getBody() }); ``` `rootVisible: true`表示显示根节点,`renderTo: Ext.getBody()`表示...

    ExtJS4中文教程2 开发笔记 chm

    在Extjs4应用中使用Ext.Loader ======================================= 11条jquery常用技巧和方法整理列表 8个超棒的学习jQuery的网站 JQuery 1.5 getJSON 的使用 JQuery AJAX提交中文乱码的解决方案 Jquery css...

    老师整理的extjs学习笔记

    #### 九、Ext.tree.TreePanel -- 树的使用 **9.1 TreePanel 的工作原理** `Ext.tree.TreePanel` 是一个用于展示树形结构数据的组件。它支持异步加载子节点,以及节点的拖放等功能。 **9.2 构建一棵静态的树** ...

    Ext 资料snow

    7. **EXT_JS实用开发指南**:`EXT_JS实用开发指南_个人整理笔记.docx`可能是作者的个人学习心得,其中包含了实践中遇到的问题和解决方案,对于初学者来说,这样的经验分享非常有价值。 8. **PDF和TXT文档**:`extjs...

    ext经典资料学习—201012

    13. **extJs 2.0 学习笔记**:这部分笔记涵盖了EXTJS 2.0版本的主要特性,包括Ajax的使用、数据管理基础、Panel的深入理解等,帮助开发者掌握EXTJS的基本用法。 EXTJS的学习是一个不断深入的过程,从基础组件到高级...

    extjs菜鸟做的动态accordion加动态tree

    7. **说明.txt**:可能包含了项目的使用说明、安装步骤或开发者笔记,对于理解项目的工作流程有帮助。 8. **.settings**、.classpath、.myhibernatedata、.mymetadata、.project、WebRoot、.myeclipse:这些都是...

    java 学习笔记

    Java学习笔记主要涵盖Java编程语言的基础知识、工具的使用以及框架的应用。在本文中,我们将深入探讨Java开发环境的配置,特别是与Eclipse和MyEclipse集成的ExtJS开发插件,以及ExtJS框架的一些常见操作和问题解决。...

    extjs学习笔记知识点总结

    13. **extJs 2.0 学习笔记**:这部分可能包括了针对2.0版本的一些特性讲解,如Ajax的使用、Ext.data模块的基础知识以及Panel组件的深入探讨。 以上只是对每个章节主题的简要概述,实际的学习笔记会更深入地讲解每个...

    New SNMP开发笔记

    ### 新SNMP开发笔记知识点详解 #### 一、配置Ubuntu的编译环境 在进行SNMP(简单网络管理协议)相关的开发工作之前,首先需要在Ubuntu操作系统上搭建一个适合的编译环境。这一过程主要涉及以下几个步骤: 1. **...

    Extjs复习笔记(十八)-- TreePanel

    在本篇ExtJS复习笔记中,我们聚焦于TreePanel组件,它是ExtJS库中的一个核心组件,用于构建可扩展的树形结构数据视图。TreePanel不仅提供了展示层级关系的数据模型,还支持交互操作,如节点的选择、展开与折叠等。在...

    Windchill培训笔记

    在本“Windchill培训笔记”中,我们将重点讨论如何进行Windchill的菜单定制,特别是针对顶级菜单的定制,以及涉及到的Action Tree和JCA Table的客制化。 首先,进行Windchill菜单定制的第一步是在安装目录的特定...

    Extjs复习笔记(十五)-- JsonReader

    它充当了一个中间人,解析JSON响应并填充Store对象,使得数据能够被Grid、Tree或其他数据驱动的组件使用。 首先,JsonReader的核心属性和方法如下: 1. **root**: 这个属性指定了JSON响应中包含记录数据的数组的键...

    2016年1月嵌入式linux笔记

    常见文件系统类型包括ext2/3/4、JFFS2、YAFFS等,选择时要考虑稳定性、空间效率和擦写耐久性。 六、设备驱动程序 设备驱动程序是操作系统与硬件之间的桥梁,使得操作系统可以控制硬件设备。在嵌入式Linux中,编写或...

    extjs实例与学习资料

    因为前段时间有两个专案要用到extjs技术,所以自己学了一段时间,在专案才发现extjs的强大,无论对于开发者还是使用者他都是一场视觉盛宴,这里有我从学习开始做的一些笔记和例子也有自己收集的学习资料,里面包括...

Global site tag (gtag.js) - Google Analytics