浅析jQuery EasyUI中的tree使用指南
本文记录的是带领成员开发一个小模块功能的时候,需要用到弹出窗口加载树状级联单位选择,最后决定用采用jQuery+EasyUI插件进行开发。但是在使用EasyUI中tree的插件时,碰到了不少麻烦。为了提供弹出树的显示速度,就采用异步加载数节点值,首先先加载根节点,然后根据点击的节点展开加载子节点。
往往结果和预期的都不一样,困惑了几天,展开后子节点是动态加载了,但是收缩后无法清空之前填充的数据;第二次在展开时,子节点又被重复加载了一遍,造成了数据重复显示,并没有提供清除子节点的方法。想尽了各种办法来解决这个问题,只能换另一种形式加载子节点的值了,把每一个节点值保存起来,判断是否已经存在,存在就不在去加载。
两种方法见实例:
vartreeTitle='选择列表'; vartreeUrl='../DataAshx/getTreeNode.ashx?pid=-1'; varnodeExp=false; varnodekeep=""; varrows; varnoinf=0; $(function(){ $('#treewindow').window({ title:treeTitle, width:400, height:400, modal:true, shadow:false, closed:true, resizable:false, maximizable:false, minimizable:false, collapsible:false }); }); functiontreeWindowOpen(name,rowIndx){ $('#treewindow').window('open'); nodekeep=""; nodeExp=false; rows=rowIndx.toString(); $('#basetree').tree({ checkbox:true, animate:true, url:treeUrl+"&coln="+escape(name.toString()), cascadeCheck:true, onlyLeafCheck:false, onBeforeExpand:function(node,param){ //------------第一种方法:异步加载子节点值------------- // $('#basetree').tree('options').url="../DataAshx/getTreeNode.ashx?pid="+node.id+"&coln="+escape(name.toString()); //------------第二种方法:Ajax方法返回子节点Json值,使用append方法加载子节点 $.ajax({ type:"POST", url:"../DataAshx/getTreeNode.ashx?pid="+node.id+"&coln="+escape(name.toString())+"&casn="+escape(node.attributes.cas.toString()), cache:false, async:false, dataType:"json", success:function(data){ if(nodekeep.indexOf(node.id)==-1) { append(data,node); nodeExp=true; } } }); $("#radCollapse").removeAttr("checked"); }, onLoadError:function(Error) { $.messager.alert('提示','查询语句出错','error'); if(nodeExp==false) { $("#basetree").children().remove(); } }, onLoadSuccess:function(success) { varchild=$("#basetree").children().length; noinf++; if(child==0&&noinf>1) { $.messager.alert('提示','数据不存在','Info'); } } }); } functiontreeWindowClose(){ $('#treewindow').window('close'); nodekeep=""; nodekeep=false; } functiontreeWindowSubmit(){ varnodes=$('#basetree').tree('getChecked'); varinfo=''; if(nodes.length>0){ for(vari=0;i<nodes.length;i++){ if(info!=''){info+=',';} info+=nodes[i].text; } //alert(JSON.stringify(nodes)); } else{ varnode=$('#basetree').tree('getSelected'); if(node!=null){ info=node.text; } } $("#"+rows).val(info); $('#treewindow').window('close'); nodekeep=""; nodeExp=false; } //全部展开 functioncollapseAll(){ $("#radCollapse").attr("checked","checked"); varnode=$('#basetree').tree('getSelected'); if(node){ $('#basetree').tree('collapseAll',node.target); }else{ $('#basetree').tree('collapseAll'); } } //全部收缩 functionexpandAll(){ varnode=$('#basetree').tree('getSelected'); if(node){ $('#basetree').tree('expandAll',node.target); }else{ $('#basetree').tree('expandAll'); } } //增加子节点 functionappend(datas,cnode){ varnode=cnode; $('#basetree').tree('append',{ parent:node.target, data:datas }); nodekeep+=","+node.id; } //重新加载 functionreload(){ varnode=$('#basetree').tree('getSelected'); if(node){ $('#basetree').tree('reload',node.target); }else{ $('#basetree').tree('reload'); } } //删除子节点 functionremove(){ varnode=$('#basetree').tree('getSelected'); $('#basetree').tree('remove',node.target); }
页面getTreeNode.ashx返回树节点JSON格式数据:
<%@WebHandlerLanguage="C#"Class="getTreeNode"%> usingSystem; usingSystem.Collections; usingSystem.Data; usingSystem.Linq; usingSystem.Web; usingSystem.Web.Services; usingSystem.Web.Services.Protocols; usingSystem.Xml.Linq; usingSystem.Collections.Generic;
publicclassgetTreeNode:IHttpHandler,System.Web.SessionState.IRequiresSessionState { publicvoidProcessRequest(HttpContextcontext) { context.Response.ContentType="text/plain"; DataTabledt=(DataTable)context.Session["viewmaintain"]; stringparentId=string.Empty; stringresultStr=string.Empty; stringattributes=string.Empty; stringcolName=string.Empty; stringsql=string.Empty; stringCasname=string.Empty; boolcolt=false; stringicon="icon-profile"; if(!string.IsNullOrEmpty(context.Request.QueryString["pid"])) { parentId=context.Request.QueryString["pid"].ToString(); } if((!string.IsNullOrEmpty(context.Request.QueryString["coln"]))&&(string.IsNullOrEmpty(context.Request.QueryString["casn"]))) { colName=HttpUtility.UrlDecode(context.Request.QueryString["coln"].ToString()); if(dt!=null) { boolpt=true; while(pt) { for(inti=0;i<dt.Rows.Count;i++) { Casname=dt.Rows[i]["view_colname"].ToString(); if(dt.Rows[i]["view_colname"].ToString()==colName) { if(dt.Rows[i]["view_cas"].ToString()!=null&&dt.Rows[i]["view_cas"].ToString()!="") { colName=dt.Rows[i]["view_cas"].ToString(); } else { colt=true; sql=dt.Rows[i]["view_sql"].ToString(); pt=false; } break; } } } } } if((!string.IsNullOrEmpty(context.Request.QueryString["casn"]))&&(!string.IsNullOrEmpty(context.Request.QueryString["coln"]))) { stringcasnName=HttpUtility.UrlDecode(context.Request.QueryString["casn"].ToString()); colName=HttpUtility.UrlDecode(context.Request.QueryString["coln"].ToString()); if(dt!=null) { for(inti=0;i<dt.Rows.Count;i++) { Casname=dt.Rows[i]["view_colname"].ToString(); if(dt.Rows[i]["view_cas"].ToString()==casnName&&casnName!=colName) { colt=true; sql=dt.Rows[i]["view_sql"].ToString(); break; } } } } try { if(parentId!=""&&colt==true) { //此处省略得到数据列表的代码 List<TreeInfo>ltree=DAL_TreeInfo.GetItemValue(parentId,sql); resultStr=""; resultStr+="["; if(ltree.Count>0) { foreach(TreeInfoiteminltree) { attributes=""; attributes+="{\"cas\":\""+Casname; attributes+="\",\"val\":\""+item._text+"\"}"; resultStr+="{"; resultStr+=string.Format("\"id\":\"{0}\",\"text\":\"{1}\",\"iconCls\":\"{2}\",\"attributes\":{3},\"state\":\"closed\"",item._id,item._text,icon,attributes); resultStr+="},"; } resultStr=resultStr.Substring(0,resultStr.Length-1); } resultStr+="]"; } else { resultStr="[]"; } } catch(Exceptionex) { resultStr="出错"; } context.Response.Write(resultStr); } publicboolIsReusable { get { returnfalse; } } }