项目场景:
将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);
}
}
//获取某个节点路径的方法,上源码,这个递归的方法我尝试了一两个小时没搞出正确的结果,最后这个极简版本来自宝哥,
我的死办法中,只要方法里面用变量保存,递归的时候都会被重置,这是个问题,宝哥绕开了这个问题
3、现在预备工作已经做完(当然这是整理之后的,实际开发的时候都是写到哪儿发现需要哪个方法公用,才会去想到写他)
首先我们获取当前节点的所有父节点:
getP_nodes(CurrentNode); //调用这个方法后父节点存进了数组ParentNodes
//遍历父节点,存进dataList,注意从后往前
//当前节点数据存进dataList
$.post("publish_insertCatalog",data,function(result){});
这样的话得发送好多次,也得写好多次………………………………………………
所以用数组dataList存下来,再转换成JSON数据发到后台
测试下如下代码:
我的死办法中,只要方法里面用变量保存,递归的时候都会被重置,这是个问题,宝哥绕开了这个问题
function getNodePath(node) {
if(node == null) return "发布库";
if(node == null) return "发布库";
var pNode = node.getParentNode();
return getNodePath(pNode) + "/" + node.name;
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));
PS:、、、、、、、、、、、这里本来是一个个节点插入的,//当前节点的子孙节点存进dataList
getAllChildNodes(CurrentNode);
$.post("publish_insertCatalog",data,function(result){});
这样的话得发送好多次,也得写好多次………………………………………………
所以用数组dataList存下来,再转换成JSON数据发到后台
测试下如下代码:
var dataList = [];
dataList .push(data);//所有的data全部组装加进去
js测验 JSON.stringify(dataList),结果为[{},{},{}],通过
好的,可以这样用!
dataList .push(data);//所有的data全部组装加进去
js测验 JSON.stringify(dataList),结果为[{},{},{}],通过
好的,可以这样用!
发送请求:
});
至此,写了测,测了改,改了再测再改,前台的数据终于全部打包完。。。
接下来后台接受处理:难点在这儿,存进数据库的记录,要保持这个父子关系,所以当父节点存进去之后要成功返回他的id后作为他的儿子(们)的ParentId字段值,刚刚打包的数据需要取出来挨个儿判断从属关系
$.post("publish_insertCatalog",{“datalist”:JSON.stringify(dataList)},function(result){
alert(result);});
至此,写了测,测了改,改了再测再改,前台的数据终于全部打包完。。。
接下来后台接受处理:难点在这儿,存进数据库的记录,要保持这个父子关系,所以当父节点存进去之后要成功返回他的id后作为他的儿子(们)的ParentId字段值,刚刚打包的数据需要取出来挨个儿判断从属关系