项目场景:
将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字段值,刚刚打包的数据需要取出来挨个儿判断从属关系

最新文章

  1. SQL2008中的Sequence
  2. RestEasy 3.x 系列之三:jsonp
  3. 配置oss bucket cors
  4. Java 第四天 Mysql
  5. e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (三) SqlServer数据库的访问
  6. TXMLDocument换行的两种方案
  7. SQL Server 创建数据库快照
  8. 20151210--MVC
  9. 选择屏幕中的下拉框和dialog中下拉框设计
  10. JavaWeb:EL & JSTL
  11. 快速理解web语义化
  12. Beta冲刺 第五天
  13. Eclipse - 安装lombok后注解无效
  14. Spark 中Java实现数据库Row转Rating
  15. table动态增加删除
  16. celery 任务队列 + redis
  17. Spark join连接
  18. 在github上创建新的分支(包括管理分支)
  19. 第四次作业——关于石墨文档(Android)客户端的案例分析
  20. (14)其他Linux命令

热门文章

  1. 继承中的隐藏(hide)重写(Override)和多态(Polymorphism)
  2. FFT最新卡常研究
  3. PHP headers_list() 函数
  4. NX二次开发-UFUN输入Part的TAG,获取整个部件表达式的TAG和表达式个数UF_MODL_ask_exps_of_part
  5. (转)Android 创建与解析XML—— Dom4j方式 .
  6. python输入输出(二)
  7. Try running RemoteDll as Administrator
  8. ES6新的特性有哪些?
  9. springboot中参数校验
  10. mac os Catalina beta andriod studio crash