项目场景:
将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. 3年A班,从现在起大家都是人质-观后感

    花了2天时间观看了由小室直子.铃木勇马.水野格导演,武藤将吾编剧的3年A班日剧. 这部剧我觉得很擅长用对比的手法,将一个受欢迎的老师人前人后强烈对比,一群外表成熟,内心却始终还是孩子气的学生对比,也将 ...

  2. vim 详解

    Vim是一个功能强大的全屏幕文本编辑器,是Linux/UNIX上最常用的文本编辑器. 它的作用是建立.编辑.显示文本文件. Vim的几种模式 正常模式: 可以使用快捷键命令,或按:输入命令行. 插入模 ...

  3. 【安装】Mac rabbitMQ

    安装 brew install rabbitmq 目录  cd /usr/local/Cellar/rabbitmq/3.7.4/sbin 插件 sudo ./rabbitmq-plugins ena ...

  4. Alibaba Cluster Data 开源:270GB 数据揭秘你不知道的阿里巴巴数据中心

    打开一篇篇 IT 技术文章,你总能够看到“大规模”.“海量请求”这些字眼.如今,这些功能强大的互联网应用,都运行在大规模数据中心上,然而,对于大规模数据中心,你又了解多少呢?实际上,除了阅读一些科技文 ...

  5. JZOJ5143:无心行挽

    Description “What’s left to do when we’ve lost all hope?”“若内心万念俱灰,是否注定无心行挽?”------来自网易云音乐<Golden ...

  6. Python+Django+ansible playbook自动化运维项目实战✍✍✍

    Python+Django+ansible playbook自动化运维项目实战  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受 ...

  7. Django开发学习BUG记录--RemovedInDjango19Warning:Model class apps.user.models.User doesn't declare an explicit app_label

    报错信息: /home/python/PycharmProjects/dailyfresh/apps/user/models.py:8: RemovedInDjango19Warning: Model ...

  8. 如何使用Hive集成Solr?

    (一)Hive+Solr简介 Hive作为Hadoop生态系统里面离线的数据仓库,可以非常方便的使用SQL的方式来离线分析海量的历史数据,并根据分析的结果,来干一些其他的事情,如报表统计查询等. So ...

  9. VS2017打包

    转载:https://blog.csdn.net/Houheshuai/article/details/78518097 在要打包项目的解决方案 右键→添加→ 新建项目 ​ 后出现如下选择 ​ 如果没 ...

  10. Android Button.getWidth()为0的问题

    View在onCreate的时候,没有渲染组件,所以获取到的宽度和高度为0, 需要添加一个观察者,在layout渲染后再去取宽高.代码如下: private Button btn_icon; @Ove ...