现在的位置: 首页 > 综合 > 正文

关于异步加载树的讨论

2013年09月18日 ⁄ 综合 ⁄ 共 1543字 ⁄ 字号 评论关闭
    几个月前做项目时遇到的一个问题, 大概有几千条数据,要求以树状显示,采用一次加载的方法无法实现,决定采用异步加载的方法,在网上找到个开源的东东XLOADTREE2,XTREE2(两个超长的JS程序)。试用之后,感觉和实际应用还有些差距。因为系统的底层框架已经搭好拉,从数据库中取数据(即一次将全部数据取出来)这一过程是不能改变的,所以不能象真正的异步加载样多次从数据库中取数据。既然不能对数据库进行操作,就只能对取出的数据进行操作。
   
    我的想法是:1。将取出的数据以XML文件的形式存储
                            2。在页面上得到XML数据源,通过唯一的字段PID对数据进行解析,首先得到一级节点。
                            3。点击由2生成的节点时,再对数据进行解析,得到该节点下的数据。
                            4。重复3的操作,直到没有数据显示为止
 
    第一步比较好实现,因为项目中有现成的方法,直接调用就可。主要是生成PID,数据都是以1,1-1,1-1-1这种形式表示层次关系的,所以在数据加载时要知道某一节点的父节点,则应该将其父节点的ID存入该节点的PID中(即截取最后一个‘—’之前的内容),一级节点因为没有父节点,所以PID为1。生成的的XML字符串形如下。
<tree>
   
<tree
value="F01" text="aa"
id
="1-F01" pid="1"
/>
   
<tree
value="F0104" text="bb"
id
="1-F01-04" pid="1-F01"
/>

。。。。。。
    
<
tree
value="F0103" text="cc"
id
="1-F01-03" pid="1-F01"
/>
   
<tree
value="F010101" text="dd"
id
="1-F01-01-01" pid="1-F01-01"
/>
。    。。。。。。
    </tree>
    第二步通过从后台得到的XML字符串中查找PID为1的一级节点treeDoc.selectNodes("//tree[@pid='"+selectID+"']"),再加入到树结构中tree.add(new WebFXTreeItem(tagHidden+showName)),tagHidden为隐藏域存的是节点ID的值,showName有两部分组成,一部分为单选或多选按钮,一部分为文本内容。WebFXTreeItem方法中的sText参数可以加很多东西,这点不错,一开始都不知CHECKBOX该怎么加。
    第三步主要是修改_p._onclick动作,得到点击节点的PID,再从treeDoc中找到PID与之相同的节点,加载到该节点下。不过这时直接用tree.add()方法无法加进去(原因我也不知道),而是要通过一条判断语句
if (tree.getSelected())
    tree.getSelected().add(new WebFXTreeItem(tagHidden+showName));
才能加载。
    第四步就无须多讲拉。
 
    由于对原代码的执行逻辑进行拉修改,所以图形显示方面也要少做修改,如有子节点的以文件夹形式显示,无子节点的以文件形式显示。还有伸缩,扩展图标,这些与原代码很多地方都有联系,所以修改起来很麻烦。我也只对_p.getIconSrc,_p.setExpanded两个动作进行修改。前一个是设置各节点图标的,后一个是设置节点展开图标的。
    由于不是真正意义上的异步加载,所以有哪位朋友实现异步加载树的,也可以提出来,大家共同交流。如上面说的有误的地方也请大家指出。

抱歉!评论已关闭.