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

ext2的树组件的使用(从底层到表现层,异步加载)

阅读更多
貌似ext2的树组件没什么变化,一个简单的树照着example弄就可以了
js 代码
  1. var Tree = Ext.tree;   
  2.       
  3.    var tree = new Tree.TreePanel({   
  4.        el:'tree',   
  5.        autoScroll:true,   
  6.        animate:true,   
  7.        enableDD:true,   
  8.        containerScroll: true,    
  9.        loader: new Tree.TreeLoader({   
  10.            dataUrl:'moduletree.do'   
  11.        })   
  12.    });   
  13.   
  14.    // set the root node   
  15.    var root = new Tree.AsyncTreeNode({   
  16.        text: '管辖单位',   
  17.        draggable:false,   
  18.        id:'source'   
  19.    });   
  20.    tree.setRootNode(root);   
  21.   
  22.    // render the tree   
  23.    tree.render();   
  24.    root.expand();  

el决定了树的显示位置,一般是个div例如

 

dataUrl决定了树的json数据来源,我这里是一个struts的action,这个action会输出json数据

 

在服务层要提供一个可以生成json格式数据的service,struts的任务是获取传来的参数调用service方法输出json

我在服务层生成json数据用的是jsonlib包,论坛有详细介绍的帖子,就不多说了

数据库有两个表来构建树,一个是树的节点表,至少包括树的id name 我这里还有一个haschild,代表有没有子节点。

另一个是节点关系表,两列分别是父节点和他对应的子节点。

service层调用dao的方法将结果集组装成List或者Map,再用jsonlib包提供的api将list转化成json,例如

js 代码
  1. //根据用户的角色和id生成用户的管辖单位树   
  2. public List getsubdept(String userid,Long roleid){   
  3.         try{   
  4. //调用dao的方法查找到结果集   
  5.         List list=roledeptdao.findRoledept(userid, roleid);   
  6. //生成json所使用的单位list   
  7.         List deptlist=new ArrayList();   
  8.         Iterator it=list.iterator();   
  9.         while(it.hasNext()){   
  10.             Ruledept rd=(Ruledept) it.next();   
  11.             Map tree = new HashMap();   
  12. //节点显示单位名              
  13. tree.put("text", rd.getId().getTYwxtDept().getDeptName());   
  14. //节点的id    
  15.         tree.put("id", rd.getId().getTYwxtDept().getDeptId());   
  16.             Object value = new Object();   
  17.             value = Boolean.TRUE;   
  18.             tree.put("cls""file");   
  19. //是否是叶子节点,我这里只有一层所以直接写的TRUE   
  20.             tree.put("leaf", value);   
  21. //将这个生成叶子节点对应的MAP加到单位list里   
  22.             deptlist.add(tree);   
  23.         }   
  24.            
  25.         return deptlist;   
  26.         }catch(Exception e){   
  27.             log.error("获取单位列表失败"+e.getMessage());   
  28.             return null;   
  29.         }   
  30.            
  31.     }   
  32.   
  33.     public JSONArray getmoduletree(String userid, String roleid) {   
  34.         List list=this.getsubdept(userid, new Long(roleid));   
  35.         if(list==null){   
  36.             return null;   
  37.         }   
  38. //转换这个list让他变成json格式       
  39.     JSONArray jsonArray = JSONArray.fromObject(list);   
  40.         return jsonArray;   
  41.     }  

在action里面调用这个service方法:

java 代码
  1. public ActionForward execute(ActionMapping mapping, ActionForm form,   
  2.             HttpServletRequest request, HttpServletResponse response) {   
  3.   
  4.         HttpSession httpsession=request.getSession();   
  5.         String roleid=(String) httpsession.getAttribute("role");   
  6.         UserInfo userinfo=(UserInfo)httpsession.getAttribute("userinfo");   
  7.         String userid=userinfo.getUserID();   
  8.         JSONArray jsonArray=this.getRoledeptservice().getmoduletree(userid, roleid);   
  9.         response.setContentType("text/json; charset=GBK");    
  10.             try {   
  11.                 response.getWriter().print(jsonArray);   
  12.             } catch (IOException e) {   
  13.                 log.error("输出json失败"+e.getMessage());   
  14.                 return null;   
  15.             }   
  16.        
  17.     return null;   
  18.     }  

 

这样一个完整的树就生成了,现在这个树是只有两层,如果是多层的就需要修改service方法来递归构造一个树的list再转化成json。

异步读取节点:首先,底层的service方法要做到每次生成的是传入参数的下一级节点的list,然后在js的 tree.setRootNode(root);下面加上这句:js 代码

  1. tree.on('beforeload', function(node){   
  2. tree.loader.dataUrl = 'createTree.do?id='+node.id;   
  3. });  

 

tree.loader.dataUrl 的值需要返回的就是该节点id的下一级的json数据

数据量大的时候异步加载要好的多,服务层也代码比起一次性全部加载的反复递归调用省不少。

分享到:
评论
16 楼 galant2008 2008-09-12  
学习学习学习学习
15 楼 shileishmily 2008-07-24  
tree.put("cls", "file");与它对应的树的节点在页面怎么没有图片显示啊
14 楼 davidcen 2008-06-19  
peterwillcn 写道
请教一个比较难得问题。

我用的是column-tree。

当我拖动一行数据到另一个节点是,如何淡出一个对话框,得到新的节点和排序的位置呢?

例如:
1
+-----1.1
+-----1.2
+-----1.3
2
+-----2.1
+-----2.2  父节点是2。排序是2

把2.2拖到1.2/1.3之间,变成了

1(父节点)
+-----1.1
+-----1.2
+-----1.3  以前的2.2。父节点变成了1。排序变成了3。
+-----1.4  以前的1.3。
2(父节点)
+-----2.1



listeners : { movenode : function(tree, node, oldParent, newParent, index) {
					alert(index+",oldParent.attributes.oid="+oldParent.attributes.oid 
					+",newParent.attributes.oid="+ newParent.attributes.oid
					+",node.attributes.oid="+node.attributes.oid);
					node.attributes.pid=newParent.attributes.oid;
					alert("new node.attributes.pid"+node.attributes.pid);
					this.root.reload();
	      } 
	    }

在columntree中添加监听器,查询columntree的父类为Treepanel,查询Treepanel的Public Events,
movenode : ( Tree tree, Node node, Node oldParent, Node newParent, Number index )
Fires when a node is moved to a new location in the tree
Listeners will be called with the following arguments:
tree : Tree
The owner tree
node : Node
The node moved
oldParent : Node
The old parent of this node
newParent : Node
The new parent of this node
index : Number
The index it was moved to

我也是刚刚看EXT,用的是2.1 其他版本的Events 可能稍有不同;目前我的打算只能是拖拽之后数据反馈到服务端,服务端有一个树型结构的cache,对此cache进行修改和重新加载,见this.root.reload();,在用户交互上做提示持久化操作,最后用户确认所有的改动完全持久化到数据库.而更好的想法是直接修改dataUrl返回的数据,但是现在我还不知道哪个API能操作这个TreeLoader里面的dataUrl,要是这样就可以不用频繁访问服务端而只是在客户端拖拽,最后确认用户的更改就行了.如果有这方面设计的高手得知,也请告知.
13 楼 jayxu 2008-05-27  
kaki 写道
有一点不明白,json-lib能够直接把list转化成json数据传吗??

json-lib本身的实现是把list内部封装的对象转换为json格式数组
12 楼 peterwillcn 2008-05-26  
请教一个比较难得问题。

我用的是column-tree。

当我拖动一行数据到另一个节点是,如何淡出一个对话框,得到新的节点和排序的位置呢?

例如:
1
+-----1.1
+-----1.2
+-----1.3
2
+-----2.1
+-----2.2  父节点是2。排序是2

把2.2拖到1.2/1.3之间,变成了

1(父节点)
+-----1.1
+-----1.2
+-----1.3  以前的2.2。父节点变成了1。排序变成了3。
+-----1.4  以前的1.3。
2(父节点)
+-----2.1

11 楼 kaki 2008-01-16  
有一点不明白,json-lib能够直接把list转化成json数据传吗??
10 楼 jasonzhl 2008-01-08  
fangzhouxing

可否把你的用dwr实现的数据的代码帖出来,或者打包上传供参考一下,我在extjs.com上面看到了很多你的帖子,感觉你对extjs的理解很深,想向你学习一下,我刚刚做了一颗树,但是有很多问题没法解决。谢谢!
9 楼 zlq4863947 2007-12-24  
呵呵,谢谢 beckrabbit提供这么好的文章,不知有没有想过用struts2的实现....
8 楼 kanxue 2007-12-14  
用火狐跟踪了一下,原来那几行代码没用,因为他传的参数是node,
客户端这样写
       loader: new Tree.TreeLoader({   
           dataUrl:'moduletree.do'   
       })
服务端只需要request.getparameter("node")即可读取
7 楼 kanxue 2007-12-11  
引用
tree.on('beforeload', function(node){   
tree.loader.dataUrl = 'createTree.do?id='+node.id;   
});


我也这样写,为啥点击不能传id啊?
6 楼 beckrabbit 2007-10-18  
fangzhouxing 写道
我使用DWR, 可以做到即时同步节点的拖动操作。

把整个树传递,数据量好像太大了。

的确,如果树比较大的话这样做不好。
但是按照一般的思维方式,做树的节点拖动这种操作一般是调整组织结构什么的,
在最后加一个保存按钮可以保证用户的输入准确度,而且可以加入还原按钮什么的。
如果每次拖动树节点都提交一次数据,拖动多次后如果用户发现树已经混乱了,
还想回到原来状态就不那么好办了,还要再把原来那颗树保存一下
5 楼 fangzhouxing 2007-10-18  
我使用DWR, 可以做到即时同步节点的拖动操作。

把整个树传递,数据量好像太大了。
4 楼 beckrabbit 2007-10-18  
fangzhouxing 写道
beckrabbit,谢谢回复。

是否考虑过树的拖动改变父节点,或者通过拖动调整同级位置的操作。



添加一个保存的按钮,这个按钮将树按照一定的规则保存成json或者数组什么的
使用DWR把组装好的树的数据传回服务端,服务端的方法解析传过来的数据,将数据保存就可以了
3 楼 fangzhouxing 2007-10-18  
beckrabbit,谢谢回复。

是否考虑过树的拖动改变父节点,或者通过拖动调整同级位置的操作。


2 楼 beckrabbit 2007-10-18  
当然可以只用一个表了 这是数据库设计的问题了
我上面的例子是直接从项目里拿出来的 只要业务逻辑能正确的组装成树形结构的list就可以了
1 楼 fangzhouxing 2007-10-18  
引用
数据库有两个表来构建树,一个是树的节点表,至少包括树的id name 我这里还有一个haschild,代表有没有子节点。

另一个是节点关系表,两列分别是父节点和他对应的子节点。


为何不用一个表实现呢?我的树表结构如下,请指正:

CREATE TABLE Docmnt_Content (
Id int NOT NULL,
Name nvarchar(255) NOT NULL,
IsLeaf nchar(1) NOT NULL,   //即 hasChildren
ParentId int NOT NULL, //父节点Id,0表示无父节点的根节点
SortOrder int NOT NULL, //用于节点同级排序
PRIMARY KEY (Id)
)


相关推荐

    ext2的树组件的使用

    本文主要介绍EXT2树组件的使用,包括从底层的JSON数据生成到表现层的渲染。 首先,EXT2的树组件(TreePanel)是通过JavaScript实现的,它依赖于EXT库提供的类和方法。在示例代码中,我们创建了一个新的TreePanel...

    Ext2.02的一些总结

    标签“源码”和“工具”提示我们可能会涉及Ext JS 2.02的底层代码结构和如何将其与其他开发工具结合使用。源码分析对于理解框架的工作原理和定制化需求至关重要,而工具则可能是指与Ext JS一起使用的构建工具、调试...

    ext-3.2.0 下载

    4. **远程数据交互**:EXT JS支持AJAX和JSONP技术,方便与服务器进行异步通信,实现数据的动态加载和提交。EXT 3.2.0可能进一步优化了这些功能,提高了数据处理效率。 5. **表单组件**:EXT JS提供了强大的表单处理...

    ext表单

    标签"源码"表明我们可能需要理解EXT JS库的底层实现,这涉及到JavaScript编程,DOM操作,以及EXT JS的API。EXT JS的源码结构清晰,注释丰富,适合学习和调试。如果你打算深入研究,可以查看EXT JS的官方文档和示例...

    Jquery+ext

    例如,jQuery可以用来初始化EXT组件,或者在EXT组件加载完成后进行进一步的定制。 ```javascript // 使用jQuery加载EXT库 $(document).ready(function() { Ext.onReady(function() { // 在EXT页面加载完成后执行...

    使用注解整合ext dwr spring hibernate

    例如,EXT的一个GridPanel可以通过DWR异步加载由Hibernate查询得到的数据。 总的来说,通过注解的方式整合EXT、DWR、Spring和Hibernate,可以实现前端UI的动态渲染、后端数据的高效管理以及两者之间的无缝通信。...

    EXT中文手册.pdf

    EXT的核心在于其强大的组件系统,包括各种可复用的UI元素,如表格、树形视图、表单、面板等,这些组件都封装了复杂的DOM操作,使得开发者可以更专注于业务逻辑而不是底层实现。 目录部分,手册列出了EXT的主要章节...

    ext_v1-1.zip

    EXT JS还支持AJAX,可以方便地与服务器进行异步通信,实现动态内容加载。 除此之外,EXT JS的布局管理也是其强大之处。它提供了一系列预定义的布局,如"fit"布局、"border"布局和"form"布局等,可以帮助开发者根据...

    EXT核心API详解 19章

    这部分会阐述如何从服务器加载数据,以及如何将数据绑定到组件上,实现数据的动态展示和更新。 第十三章至第十五章可能涉及EXT的Ajax和JSON,讲解如何使用EXT的Ajax API进行异步请求,以及JSON数据格式在EXT中的...

    ext.net 3.2

    开发者可以像操作普通.NET控件一样使用Ext.NET组件,同时享受到富客户端体验。 3. **组件库** Ext.NET 3.2包含大量预构建的UI组件,如网格、表格、面板、按钮、表单、图表等,这些组件都经过精心设计,能够满足...

    ext 2.2中文版

    6. **API文档**:"Ext 2 API Documentation"是开发者的重要参考资料,包含了所有类、方法、属性的详细说明,以及示例代码,帮助开发者理解和使用ExtJS的各种功能。 7. **范例和教程**:通常,中文版文档还会包含...

    Ext4 MVC 框架设计

    通过使用Ext.data.Model类,开发者可以定义数据字段和关联规则,同时利用Ext.data.Store管理数据集,实现异步加载和缓存机制。 2. **视图(View)**: 视图负责展示数据和用户界面。在Ext4中,视图由组件...

    ext-1.0.1.rar

    1. **EXT Core**:这是EXT库的基础,包含了一些基本的DOM操作、事件处理和实用函数,为其他组件提供底层支持。 2. **Components**:EXT提供了大量的UI组件,如表格(Grid)、面板(Panel)、菜单(Menu)、按钮...

    js脚本库源码及实例(ext)

    7. **AJAX和远程数据处理**:EXT JS通过Ajax技术与服务器进行异步通信,实现了动态数据加载和更新,提高了用户体验。 这个名为"ext-1.1"的压缩包很可能包含了EXT JS的早期版本源码,这为我们了解EXT JS的历史发展和...

    EXT中文手册 (pdf)

    AJAX(异步JavaScript和XML)是EXT库的基础,它实现了后台数据的无刷新加载和更新,改善了用户的交互体验。EXT库通过AJAX技术封装了复杂的网络请求,让开发者能够专注于业务逻辑,而不是底层通信细节。 JavaScript...

    ext2.0

    EXT JS致力于提供一套完整的、跨浏览器的组件化开发工具,使得开发者能够创建功能丰富的Web应用程序,而无需深入理解底层的HTML、CSS和JavaScript细节。 Ajax(Asynchronous JavaScript and XML)技术是EXT2.0的...

    ext 2.0.2 源码 例子

    压缩包中的"ext-2.0.2"文件包含的就是EXTJS 2.0.2的完整源代码,通过研究这个文件,你可以了解到EXTJS的架构设计、组件实现以及各种功能的底层逻辑。这对于深入理解EXTJS,甚至自定义EXTJS组件都是非常有帮助的。

    ext入门学习.pdf

    3. Ajax支持:内置的Ajax支持使得数据的异步加载和更新变得简单,提升了用户体验。 4. 完善的事件处理:ExtJS拥有强大的事件处理系统,允许开发者绑定各种事件,实现组件间的交互和响应式设计。 开始使用ExtJS,...

    ext-1.0源码+部分中文解读

    EXTJS是一个广泛使用的JavaScript库,尤其在开发富客户端应用程序时,EXT-1.0是EXTJS的早期版本,它提供了丰富的组件和强大的数据管理功能。本文将深入EXT-1.0的源码,探讨其中的核心概念和技术,以及部分中文解读。...

    ASP.net AJAXExt Setup

    2. **AJAXExt**:AJAXExt是针对ASP.NET AJAX的一个第三方扩展,它提供了一系列额外的控件和实用工具,如日历、下拉树、拖放功能、弹出框等。这些控件增强了默认的ASP.NET AJAX功能,使开发人员可以更轻松地创建复杂...

Global site tag (gtag.js) - Google Analytics