1. 程式人生 > >第五篇:zTree節點的一些操作,權當備份

第五篇:zTree節點的一些操作,權當備份

專案場景:
將zTree的一個節點挪到某個已知的根節點下,因為樹上的節點都是資料庫查詢出來的,所以不能直接用addNodes()這個方法(否則一重新整理又恢復原樣了),而是要把這個節點及其某些屬性資料儲存到資料庫中,
進一步的需求是:如果層級很多,挪過去的時候,要連帶他的所有父節點,子孫節點一起挪過去,加上他們的屬性儲存至資料庫

屢一下,邏輯過程如下:
1、點選某個節點,假設樹物件為ZTree,首先獲取選中節點var CurrentNode= ZTree.getSelectedNodes(); 
2、編寫各種需要獲取資料的方法,等待後面一個個用
遞迴獲取他的所有父節點(祖先們)並存起來,ztree的API有個getPath()方法,能獲取所有的父節點以及自己,但是不知道為什麼不能用)

//定義父節點儲存位置 var ParentNodes = [];
//定義待請求資料儲存的陣列  var dataList=[]; //獲取某個節點的所有父節點的方法  function getP_nodes(node){     if(node==null)   return null;     var pnodes = node.getParentNode();     if ( pnodes != null){         ParentNodes .push(pnodes);         getP_nodes(pnodes);     } }
  //獲取某個節點路徑的方法,上原始碼,這個遞迴的方法我嘗試了一兩個小時沒搞出正確的結果,最後這個極簡版本來自寶哥,
我的死辦法中,只要方法裡面用變數儲存,遞迴的時候都會被重置,這是個問題,寶哥繞開了這個問題
function getNodePath(node) {
     if(node == null)  return "釋出庫";      var pNode = node.getParentNode();
     return getNodePath(pNode) + "/" + node.name; }

//獲取節點的標籤過濾方法 function getTagFilter(node){ var tagFilter = "(TagName=' "; var pnode = node.getParentNode(); if(pnode!=null){ tagFilter += pnode.name+" ' AND TagValue=' "+node.name+ " ')"; }else{ tagFilter += node.name+" ') "; } return tagFilter; } 

//構建每個節點的data的方法(存進資料庫的一條記錄包含這些欄位) function constructData(node){ var data={}; data.name = node.name;//節點的名字 data.parentID = $("#targetCatalog").data("id");//最鄰近的父節點的id data.operCode = "1";//先預設都是1  data.depth = node.level+1;//深度,根節點是0,往下依次加1 data.path = getNodePath(node);//節點在樹裡面的路徑,“/”隔開 data.orderIndex = "1";//先放一邊吧,這個太複雜,還沒想好怎麼整他 data.tagFilter = getTagFilter(node);//過濾標籤,TagName=父節點的名字,TagValue=節點名字 data.id = node.id;//節點的id data.pId = node.pId;//節點的父ID data.isParent = node.isParent+"";//是否是父節點 return data; } 

//將當前節點的所有子孫節點的屬性資料存進dataList的方法 function getAllChildNodes(node){ if(node==null||!node.isParent) return null; var childNodes = node.children; for(var i in childNodes){ dataList.push(constructData(childNodes[i])); getAllChildNodes(childNodes[i]); } } 
3、現在預備工作已經做完(當然這是整理之後的,實際開發的時候都是寫到哪兒發現需要哪個方法公用,才會去想到寫他)
首先我們獲取當前節點的所有父節點: 
getP_nodes(CurrentNode); //呼叫這個方法後父節點存進了陣列ParentNodes 
//遍歷父節點,存進dataList,注意從後往前
var pl = ParentNodes.length; if(pl>0){ for(var i=pl-1;i>=0;i--){ dataList.push(constructData(ParentNodes[i])); } } 
//當前節點資料存進dataList dataList.push(constructData(CurrentNode));
//當前節點的子孫節點存進dataList getAllChildNodes(CurrentNode);   PS:、、、、、、、、、、、這裡本來是一個個節點插入的,
$.post("publish_insertCatalog",data,function(result){});
這樣的話得傳送好多次,也得寫好多次………………………………………………

所以用陣列dataList存下來,再轉換成JSON資料發到後臺
測試下如下程式碼:  var  dataList = [];
dataList .push(data);//所有的data全部組裝加進去
js測驗 JSON.stringify(dataList),結果為[{},{},{}],通過

好的,可以這樣用!
  傳送請求:
$.post("publish_insertCatalog",{“datalist”:JSON.stringify(dataList)},function(result){         alert(result);
});

至此,寫了測,測了改,改了再測再改,前臺的資料終於全部打包完。。。

接下來後臺接受處理:難點在這兒,存進資料庫的記錄,要保持這個父子關係,所以當父節點存進去之後要成功返回他的id後作為他的兒子(們)的ParentId欄位值,剛剛打包的資料需要取出來挨個兒判斷從屬關係