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

第五篇:zTree节点的一些操作,权当备份的更多相关文章

  1. 深入理解DOM节点类型第五篇——元素节点Element

    × 目录 [1]特征 [2]子节点 [3]特性操作[4]attributes 前面的话 元素节点Element非常常用,是DOM文档树的主要节点:元素节点是html标签元素的DOM化结果.元素节点主要 ...

  2. ztree设置节点checked,选中某节点等相关操作

    ztree设置节点checked,选中某节点等相关操作 1.根据id获取树的某个节点: var zTree = $.fn.zTree.getZTreeObj("mytree"); ...

  3. 【Python五篇慢慢弹】快速上手学python

    快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...

  4. 【Python五篇慢慢弹】数据结构看python

    数据结构看python 作者:白宁超 2016年10月9日14:04:47 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给出的pythondoc ...

  5. 【Python五篇慢慢弹(4)】模块异常谈python

    模块异常谈python 作者:白宁超 2016年10月10日12:08:31 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给出的pythondo ...

  6. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  7. 解剖SQLSERVER 第五篇 OrcaMDF里读取Bits类型数据(译)

    解剖SQLSERVER 第五篇  OrcaMDF里读取Bits类型数据(译) http://improve.dk/reading-bits-in-orcamdf/ Bits类型的存储跟SQLSERVE ...

  8. 前端工程师技能之photoshop巧用系列第五篇——雪碧图

    × 目录 [1]定义 [2]应用场景 [3]合并[4]实现[5]维护 前面的话 前面已经介绍过,描述性图片最终要合并为雪碧图.本文是photoshop巧用系列第五篇——雪碧图 定义 css雪碧图(sp ...

  9. 第五篇 :微信公众平台开发实战Java版之如何获取公众号的access_token以及缓存access_token

    一.access_token简介 为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台 开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等, 开 ...

随机推荐

  1. loj2000[SDOI2017]数字表格

    题意:f为Fibnacci数列.求$\prod_{1<=i<=n,1<=j<=m} f[gcd(i,j)]$. n,m<=1e6. 标程: #include<bit ...

  2. JavaScript: 变量提升和函数提升

    第一篇文章中提到了变量的提升,所以今天就来介绍一下变量提升和函数提升.这个知识点可谓是老生常谈了,不过其中有些细节方面博主很想借此机会,好好总结一下. 今天主要介绍以下几点: 1. 变量提升 2. 函 ...

  3. Go 静态类型声明

    Go 静态类型声明 package main import "fmt" func main() { var x float64 x = 20.0 fmt.Println(x) fm ...

  4. vijos1710 Mrw的工资计划

    #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> ...

  5. Jboss集群(五)--F5硬件负载均衡器双击热备 + Jboss集群终极实现

    BIG/IP利用定义在其上面的虚拟IP地址来为用户的一个或多个应用服务器提供服务.因此,它能够为大量的基于TCP/IP的网络应用提供服务器负载均衡服务.BIG/IP连续地对目标服务器进行L4到L7合理 ...

  6. Ubuntu 18.04.2 aliases 设置永久生效解决方案

    设置 临时 alias alias ll="ls -al" 缺点是下次登录时就不生效了 永久生效解决方案 进入到 etc 文件夹下 cd /etc/ 创建 bash_aliases ...

  7. 最详尽使用指南:超快上手Jupyter Notebook

    最详尽使用指南:超快上手Jupyter Notebook - CSDN博客https://blog.csdn.net/DataCastle/article/details/78890469

  8. jvm监控命令-jstat

    jstat 用于查看服务器上某个服务的GC情况. 一般使用方式jstat –gcpid或jstat –utilpid 时间间隔-每个一定时间(指定的时间间隔)输出一次进程pid的内存情况及gc情况. ...

  9. A1095 Cars on Campus (30 分)

    Zhejiang University has 8 campuses and a lot of gates. From each gate we can collect the in/out time ...

  10. Apache Solr 远程命令+XXE执行漏洞(CVE-2017-12629)

    Apache Solr 最近有出了个漏洞预警,先复习一下之前的漏洞 命令执行 先创建一个listener,其中设置exe的值为我们想执行的命令,args的值是命令参数 POST /solr/demo/ ...