最近项目用到树型结构的交互,一开始并不打算选择zTree,为了项目进度我妥协了,这一妥协后果就是我进坑了,在2天的挣扎中,我终于跳出坑了,活了下来,有一些感慨纪录下来。

有一个业务场景需要2个树型结构,一个初始化树型结构,标示为左树,另一个则是为选择后生成的新树结构,标示为右树;

首先在左树选择要使用的数据,点击新增在右树展示所选的数据的新树结构。

这个功能在jquery.zTree的API里面是没有的。

原本以为zTree可以给我一个很好的封装实现,结果懵逼都来不急。没有这样的实现,没辙了改造,在jquery.zTree代码中封装了一个方法来实现这样的移植功能。

代码如下:

getStarNodes: function () {
var tp = [];
var list = [];
//获取当前树选择的数据结构
var treeData = data.getRoot(setting).children;
//数据移植到新变量上操作
var par = $.extend(true, [], treeData);
for (var i = 0; i < par.length; i++) {
if (par[i].checked == true) {
tp = [];
for (var j = 0; j < par[i].children.length; j++) {
if (par[i].children[j].checked == true) {
tp.push(par[i].children[j]);
}
}
par[i].children = tp;
list.push(par[i])
}
}
return list;
}

在上段代码中:

变量tp是个临时数组

变量list是装最终的数据的数组

变量treeData是通过zTree中getRoo方式获取数据

getRoot: function (setting) {
return setting ? roots[setting.treeId] : null;
}

在这里直接return roots[setting.treeId]  如果setting对象是false则返回null。zTree中初始就定义了roots={},用roots保存完整数据,

注意:当treeData获取到数据是数组形式,不能直接for循环操作其数组,因为会在获取数据中的children重新赋值,par[i].children = tp;如果拿原来数据结构的则造成数据混乱,必须复制一个独立的数据进行操作,这样才能把原数据和操作之后的数据隔离开,这里用jquery的extend方法来实现数据移植。

在树对象新增操作的时候直接调用getStarNodes即可:

 var tree1 = $.fn.zTree.getZTreeObj("tree");
var nodeList = tree1.getStarNodes();

将nodeList(通过getStarNodes方式过滤的数组)传给新树对象中去

 var tree2 = $.fn.zTree.getZTreeObj("tree2");
tree2.addNodes(null, nodeList, null);

新树对象tree2就可以拿这个数据结构遍历了。这个功能就这样实现了。在这个操作中,我们用到addNodes方法,但是我用的发现一个bug。在我每次点击新增的时候就addNodes就会上次选择的数据继续累加在新的数据里面,我加了一个清空处理数据就不会出现重复累加。下面zTree源码中操作

        addNodes: function (setting, parentNode, index, newNodes, isSilent) {
if (setting.data.keep.leaf && parentNode && !parentNode.isParent) {
return;
}
if (!tools.isArray(newNodes)) {
newNodes = [newNodes];
}
if (setting.data.simpleData.enable) {
newNodes = data.transformTozTreeFormat(setting, newNodes);
}
if (parentNode) {
var target_switchObj = $$(parentNode, consts.id.SWITCH, setting),
target_icoObj = $$(parentNode, consts.id.ICON, setting),
target_ulObj = $$(parentNode, consts.id.UL, setting); if (!parentNode.open) {
view.replaceSwitchClass(parentNode, target_switchObj, consts.folder.CLOSE);
view.replaceIcoClass(parentNode, target_icoObj, consts.folder.CLOSE);
parentNode.open = false;
target_ulObj.css({
"display": "none"
});
} data.addNodesData(setting, parentNode, index, newNodes);
view.createNodes(setting, parentNode.level + 1, newNodes, parentNode, index);
if (!isSilent) {
view.expandCollapseParentNode(setting, parentNode, true);
}
} else {
//在这里对数据进行清空处理,这样方式是处理方法其中之一
data.getRoot(setting).children = [];
data.addNodesData(setting, data.getRoot(setting), index, newNodes);
view.createNodes(setting, 0, newNodes, null, index);
}
}

这样UI交互也实现了,也保证所选数据结构正确,才能正常使用。

jQuery.zTree的跳坑记录的更多相关文章

  1. Android开发跳坑记录

    本文主要记录在Android开发中遇见的一些问题,以及解决方法. 2015.12.01 1.adb.exe 端口被占用 解决: http://blog.csdn.net/xiaanming/artic ...

  2. 两百条微信小程序跳坑指南(不定时更新)

    微信小程序联盟出品 跳坑textarea<二百二十三>不显示文本及textarea相关问题集合跳坑<二百一十三> background-image无法获取本地资源图片....跳 ...

  3. jquery ztree 刷新后记录折叠、展开状态

    ztree :http://www.ztree.me/v3/main.php 项目中用到了这个插件,刚好也有需求 在页面刷新后,保存开始的展开.折叠状态, 其实 dtree: http://www.d ...

  4. JavaScript 跳坑指南

    JavaScript 跳坑指南 坑0-String replace string的replace方法我们经常用,替换string中的某些字符,语法像这样子 string.replace(subStr/ ...

  5. JQuery ztree 异步加载实践

    本来要做一个文件目录浏览界面,需要遍历所有的文件和目录,很显然一次性读取时很费时费力的一件事情. 因此就需要做异步加载.... 不过网上的几篇帖子还挺坑的!原始参考:JQuery异步加载实例,相对来说 ...

  6. webapp填坑记录[更新中]

    网上也有许多的 webapp 填坑记录了,这几个月,我在公司正好也做了2个,碰到了一些问题,所以我在这里记录一下我所碰到的问题: meta 头部声明在开发的时候,刚刚创建 HTML 文件,再使用浏览器 ...

  7. CentOS7.4安装MySQL踩坑记录

    CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...

  8. SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

    Spring boot +Spring Security + Thymeleaf认证失败返回错误信息踩坑记录 步入8102年,现在企业开发追求快速,Springboot以多种优秀特性引领潮流,在众多使 ...

  9. 微信小程序之蓝牙 BLE 踩坑记录

    前言 前段时间接手了一个微信小程序的开发,主要使用了小程序在今年 3 月开放的蓝牙 API ,此过程踩坑无数,特此记录一下跳坑过程.顺便开了另一个相关的小项目,欢迎 start 和 fork: BLE ...

随机推荐

  1. Python爬虫利器三之Xpath语法与lxml库的用法

    前面我们介绍了 BeautifulSoup 的用法,这个已经是非常强大的库了,不过还有一些比较流行的解析库,例如 lxml,使用的是 Xpath 语法,同样是效率比较高的解析方法.如果大家对 Beau ...

  2. TBitmapSurface.StretchFrom

    procedure TBitmapSurface.StretchFrom(const Source: TBitmapSurface; const NewWidth, NewHeight: Intege ...

  3. wget 断点续传 & nginx文件服务器

    nginx默认支持断点续传: 测试方法: wget -S http://httpd.apache.org/images/httpd_logo_wide_new.png 2>&1 | gr ...

  4. hdu 1429

    http://acm.hdu.edu.cn/showproblem.php?pid=1429 一个广搜的简单题吧,不过有意思的事这个题目用到了位运算,还有就是很恶心的MLE #include < ...

  5. [Linux]I/O多路复用和epoll

    首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象. 不管是文件,还是套接字,还是管道,我们都可以把他们看作流. 之后我们来讨论I/O的操作,通过read ...

  6. iOS 创建一个可以点击并拖拽的Button

    HSCButton.h #import <UIKit/UIKit.h> @interface HSCButton : UIButton { CGPoint beginPoint; } @p ...

  7. js数组的sort排序详解

    <body> <div> sort()对数组排序,不开辟新的内存,对原有数组元素进行调换 </div> <div id="showBox" ...

  8. October 27th Week 44th Thursday 2016

    The art of being wise is the art of knowing what to overlook. 智慧之道在于懂得该忽略什么. Always do your best. Wh ...

  9. DOM对象—选中执行效果

    ---恢复内容开始--- 例如我们注册时,一些法律条例,我们是否同意决定着能否注册.在选择同意或不同意时出现的效果. 先在body里做一个按钮和选项框. <input type="ch ...

  10. SVN数据仓库迁移

    1.在新服务器上部署环境 yum -y install subversion 2.备份原服务器数据仓库 svnadmin dump /home/myrepos >/data/svn_dump s ...