- <script>
- dojo.require("dojo.data.ItemFileWriteStore");
- dojo.require("dijit.Tree");
- dojo.require("dojo.parser");
- </script>
- <script type="text/javascript" src="../js/soapclient.js"></script>//包括soap访问webService的方法,网上就可以下得到
- <script type="text/javascript" >
- var pagenumber=0;
- var pagesize=0;
- var orderBy='0';
- var treesDate ={ label:'name',identifier:'eId',items:data};
- var popStore = new dojo.data.ItemFileWriteStore({data: treesDate});
- var myModel = new dijit.tree.ForestStoreModel({
- store: popStore,
- rootId: "0",
- rootLabel: "分类",
- childrenAttrs: ["children"]
- });
- var _tree=dijit.byId("tree");
- /*
- 读取webService数据方法
- codeID:父结点id,
- chitem:父结点item,
- layerInt: 标记展开的层数
- layerSum: 总共要读取的层数
- */
- function getTreeNodes(codeID,chitem,layerInt,layerSum){
- var pl = new SOAPClientParameters();
- pl.add('codeID',codeID) ;
- pl.add('pageNumber',0) ;
- pl.add('pageSize',0) ;
- pl.add('orderBy',0) ;
- SOAPClient.invoke(url, "getCodeByParCodeID", pl, false, function GetEnu_callBack(ul, soapResponse){
- var pInfo = {
- parent: chitem,
- attribute: "children"
- };
- if(ul!=null && ul.length>0 ){
- for(var i = 0; i < ul.length; i++){
- var ulo=ul[i];
- var newitem=popStore.newItem({name: ulo["ns:name"],type:ulo["ns:parCode"] ,eId:ulo["ns:id"],haveChild:"0"}, pInfo);//haveChild=0:初始,1:有子结点,2:无子结点
- if(layerInt<layerSum)getTreeNodes(ulo["ns:id"],newitem,layerInt+1,layerSum);
- }
- if(chitem!=null){
- popStore.setValue(chitem,"haveChild","1");
- var node = dijit.byId("tree")._itemNodeMap[chitem.eId];
- node._updateItemClasses(node.item);
- }
- }else{
- popStore.setValue(chitem,"haveChild","2");
- }
- });
- }
- /*
- 展开指定结点、指定层的树节点方法
- tree:展开的树
- treeNode:展开的树结点node
- layerInt: 标记展开的层数
- layerSum: 展开指定结点下几层
- */
- function expandAllChildrenNode(tree,treeNode,layerInt,layerSum){
- tree._expandNode(treeNode);
- var childrenArray=treeNode.getChildren();
- for (var i=0; i<childrenArray.length; i++){
- if(layerInt<layerSum) expandAllChildrenNode(tree,childrenArray[i],layerInt+1,layerSum);
- //if(layerInt==layerSum&&tree.model.mayHaveChildren(childrenArray[i].item))childrenArray[i].
- if(layerInt==layerSum)childrenArray[i]._updateItemClasses(childrenArray[i].item);
- }
- }
- function init(){
- getTreeNodes(0,null,0,2);//打开页面时读取、加载两层树结点
- expandAllChildrenNode(_tree,_tree.rootNode,0,1);//默认展开只一层,加载第二层结点的目的主要是为了获得第一层结点是否可展开的信息
- /*
- 当用户展开结点时加载该结点的子结点的子结点
- */
- dojo.connect(dijit.byId("tree"), "_onExpandoClick", function(message){
- var node = message.node;
- var ch2node=node.getChildren();
- for (var i=0; i<ch2node.length; i++){
- if(ch2node[i].getChildren().length==0&&ch2node[i].item.haveChild=="0"){
- var ch2item =ch2node[i].item;
- getTreeNodes(ch2item.eId,ch2item,0,1);
- }
- }
- });
- }//END INIT
- dojo.addOnLoad(init);
- </head>
- <body class="tundra">
- <div id="tree" showRoot="true" persist="false" dojoType="dijit.Tree" store="popStore" labelAttr="name" childrenAttr="children" model="myModel" ></div>
- </body></html>
树是系统中经常用到的控件,在数据量大的情况下,加载的速度通常就会比较慢!要想提高加载速度,最好就是分层的从服务端读取数据,分层加载页面的树结点。下面的树利用ajax技术,通过soap协议调用webService,读取数据库的数据;由dojo提供的树控件方法生成树。加载页面时,只读取、生成第一、二层的树结点;当用户第一次展开某结点时,再次从服务端读取该结点的子结点,由于使用了AJAX技术,每次访问服务端时,不再需要刷新网页,使得页面仍然会保持很好的稳定性。
转载于:https://www.cnblogs.com/mylem/archive/2009/11/15/1603248.html