项目场景:
将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. ps使logo背景色透明

    方法一:魔法工具(对复杂的logo误差较大) 魔法工具--左键点击选区--delete--保存 方法二:拾色器 1.有的站上的素材图片不能直接用,需要先变成rgb图像,可这样操作:图像\模式,选择rg ...

  2. Delphi如何实现无边框窗体的移动

    在控件的MouseDown事件中加入if (ssleft in Shift) then begin ReleaseCapture; Perform(WM_syscommand, $F012, 0);e ...

  3. VC图片裁剪源代码

    #include <atlimage.h> int main() { CString filepathname = "D:\\1.png", filepathname1 ...

  4. ionic-Javascript:ionic 上拉菜单(ActionSheet)

    ylbtech-ionic-Javascript:ionic 上拉菜单(ActionSheet) 1.返回顶部 1. ionic 上拉菜单(ActionSheet) 上拉菜单(ActionSheet) ...

  5. iOS开发UIResponder简介API

    #import <Foundation/Foundation.h> #import <UIKit/UIKitDefines.h> #import <UIKit/UIEve ...

  6. Java 中的 SPI 机制是什么鬼?高级 Java 必须掌握!

    作者:sigangjun blog.csdn.net/sigangjun/article/details/79071850 SPI的全名为:Service Provider Interface,大多数 ...

  7. Caused by: java.io.FileNotFoundException: class path resource [com/cxy/springboot/mapping/] cannot be resolved to URL because it does not exist

    java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.conte ...

  8. Django form组件 与 cookie/session

    目录 一.form组件 二.cookie.session 返回Django 组件 一.form组件 1.1 以注册功能为例 注册功能 1.渲染前端标签获取用户输入 --> 渲染标签 2.获取用户 ...

  9. js清空input file值

    项目进行导入操作,如果第一次导入某个文件会触发导入操作,但是第二次导入重复该文件,不会触发操作. 分析了原因,是因为上一次file里选择的文件路径值与本次选择的文件路径值是一样的,值没有改变所以导致f ...

  10. wpf datagrid 如何自定义行的控件实例,(textbox 并选中则全选)

    主要是为了用户输入方便 按回车,选中下一列,text自动获取焦点,输入状态 获取控件实例  https://blog.csdn.net/m15188153014/article/details/486 ...