zoukankan      html  css  js  c++  java
  • 第五篇:zTree节点的一些操作,权当备份

    项目场景:
    将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字段值,刚刚打包的数据需要取出来挨个儿判断从属关系 
  • 相关阅读:
    CI平台
    【转】深藏不露,处世之道
    编写vscode插件
    css背景图宽度只适应,高度不变
    vue实现pc端无限加载功能
    box-shadow比较美观的阴影
    Nuxt.js项目实战
    vue图片放大镜效果
    vue分页组件
    为什么计算机中的小数位无法精确
  • 原文地址:https://www.cnblogs.com/yb38156/p/9821807.html
Copyright © 2011-2022 走看看