easyUI同步树的详解

简介树控件

树控件,很常用,比如它可以做有层级的菜单。比如公司的部分划分、省市区的选择。。。

最大的好处就是有层级关系,看起来和选择起来都比较清晰,就像一串杂乱无章的json你用bejson去格式化一样的感觉。

所以,掌握树控件,是很有必要的,为什么?因为它很有用,用的恰当,也可以适当提升用户体验,

树的两种加载方式

tree的加载方式分为常规加载和异步加载两种,其中常规加载也就是一次性把整棵树都加载出来,而异步加载呢就是当展开父节点的时候才会去加载子节点。

一般肉眼上可以观察到异步加载的树在点击父节点的时候会有一个load...的提示~其次呢你也可以抓包看~

好的~今天先来说说同步加载,这个在数据量较小的时候比较常用,还有一种情况,也不得不用同步加载,那就是在需要全选或者级联选择的时候。若使用异步加载,那么当你若未展开父节点而勾选了父节点的话,实际上只有父节点被选中(因为此时其下的子节点还未加载),也就造成了“选择丢失”,所以这种情况需要使用同步加载。如果数据量很大,那么需要给出适当的进度提示来提升用户体验。

Tree In EasyUI

看看tree在easyUI中的具体用法吧:

两种方式来加载数据:一种是通过js的data,另外一种通过li标签

<ul class="easyui-tree" data-options="url:'tree_data1.json',method:'get',animate:true"></ul>
<ul class="easyui-tree">
            <li>
                <span>My Documents</span>
                <ul>
                    <li data-options="state:'closed'">
                        <span>Photos</span>
                        <ul>
                            <li>
                                <span>Friend</span>
                            </li>
                            <li>
                                <span>Wife</span>
                            </li>
                        </ul>
                    </li>
                    <li>
                        <span>Program Files</span>
                        <ul>
                            <li>Java</li>
                            <li>Games</li>
                        </ul>
                    </li>
                    <li>welcome.html</li>
                </ul>
            </li>
        </ul>

简单吧,个人推荐使用js的方式来加载比较复杂的内容,因为组装数据比较容易一些,弄个json丢过来就好了~

当然若使用Velocity等模板引擎,第二种方式似乎也不错吧~好,言归正传,通过上面那一行代码相信你也明白了,tree的关键在于如何组织数据结构。

首先,我们要返回一个数组给前台,结构类似:

[
    {
        "id": 1,
        "text": "My Documents",
        "children": [
            {
                "id": 11,
                "text": "Photos",
                "state": "closed",
                "children": [
                    {
                        "id": 111,
                        "text": "Friend"
                    },
                    {
                        "id": 112,
                        "text": "Wife"
                    }
                ]
            },
            {
                "id": 14,
                "text": "about.html"
            },
            {
                "id": 15,
                "text": "welcome.html"
            }
        ]
    }
]

这里简单解释一下,这个数组中的每一个json代表的是最高层的父级,如上只定义了一个最高父级——My Documents。并且这个最高父级下面包含了3个子级,分别是id为11的Photos、id为14的about、和id为15的welcome,相信应该看的出来吧。

id一般为该节点的标识符,唯一

text则为该节点显示的文本

state指定该节点的是展开的还是关闭的(对叶子节点无效)‘open‘ or ‘closed‘.

其中Photos还有子级。。。而about和welcome则不包含子级,这种特殊的节点叫做叶子节点。相信大家也观察到了,children这个属性决定了该节点是否是叶子节点,若该属性不存在或为空,那么它就是叶子节点。

可以看看上述json对应的树:

这里也可以看到easyUI默认对于叶子节点的显示是以“文档图标”,而对于包含下级的节点用的是“文件夹图标”,替换这些图标也很简单。

只需要在上述的属性中,再定义一个iconCls就可以了~

像这样的树一般是单选树,若我们想要支持多选的话,可以为每个图标前加上一个多选框checkbox

<ul class="easyui-tree" data-options="checkbox:true,url:'tree_data1.json',method:'get',animate:true"></ul>

加上这个的话,那么树节点又多了一种属性——checked,也就是指明是否被选中了。

所以总结一下,我们可以为tree node定义的属性有这么五种:id、text、state、iconCls、checked,别忘了,还有一个children,这个children也是一个treenode

那么在后台我们可以定义一个TreeNode的实体,方便我们组装数据和整理逻辑。

具体应用

大概知道了tree的用法,那么我们来考虑这么一个场景,在酒店中,不同的服务员需要服务不同的客房,比如说小王负责4层和5层,小李负责6层和7层,当然也可能小王只负责三楼的部分房间。另外,酒店里可能会有不同的楼,比如主楼和副楼,客房是归在这些楼里的。考虑到这里是要选择具体房间的,所以使用同步加载比较合理。

在这里可以归纳出几个层级关系:楼 号——》层号——》房间号(从高到低),并且楼号和层号都为父节点,而房间为叶子节点

并且我们这里考虑加一个 “所有房间” 父节点,方便全选:

		List<RoomNode> treeNodeList = new ArrayList<RoomNode>(1); // 第一层仅有一个head
		RoomNode head = new RoomNode();
		List<Node> children = new ArrayList<Node>();
		head.setChildren(children);
		head.setId("0");
		head.setText("所有房间");
		head.setIconCls("icon-tree-room-all");
		treeNodeList.add(head);
		List<Hall> buildingList = roomService.getAllHalls();
		for (Hall _building : buildingList) {
			List<GuestRoom> guestRoomList = roomService
					.getAllGuestRoomsFloor(_building.getBg_code());
			List<Node> floorList = new ArrayList<Node>(guestRoomList.size());
			RoomNode building = new RoomNode();
			building.setId(_building.getBg_code());
			building.setText(_building.getBg_descript());
			building.setState("closed");
			building.setChildren(floorList);
			building.setIconCls("icon-tree-room-building");
			children.add(building);

			for (GuestRoom _floor : guestRoomList) {
				guestRoomList = roomService.getGuestRooms(_floor.getFloor(),
						_building.getBg_code());
				List<Node> roomList = new ArrayList<Node>(guestRoomList.size());
				RoomNode floor = new RoomNode();
				floor.setId(_floor.getFloor());
				floor.setText(_floor.getFloor() + "楼");
				floor.setState("closed");
				floor.setChildren(roomList);
				floor.setIconCls("icon-tree-room-floor");
				floorList.add(floor);

				for (GuestRoom _room : guestRoomList) {
					RoomNode room = new RoomNode();
					if (checkedRooms != null
							&& checkedRooms.indexOf(_room.getRoomno().trim()) > -1) {
						room.setChecked(true);
					}
					room.setId(_room.getRoomno().trim());
					room.setText(_room.getRoomno() + "房");
					room.setIconCls("icon-tree-room-room");
					roomList.add(room);
				}
			}
		}

同步加载的整个过程还是比较简单,无非也就是通过setChildren来搞定父子级的关系,没有别的复杂操作了。

下面给出一张替换完图标的效果图:

在下一篇文章中,将会介绍异步树的使用方法~这种树的优点就是用到的时候再加载,节省了不必要的流量以及加载时间。

时间: 2024-08-28 14:50:20

easyUI同步树的详解的相关文章

JQuery Easy Ui (Tree树)详解(转)

JQuery Easy Ui (Tree树)详解(转) 第一讲:JQuery Easy Ui到底是什么呢? 首先咱们知道JQuery是对Java Script的封装,是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等.. JQuery ui是在jQuery的基础上,利用jQuery的扩展性,设计的插件. 那么JQuery Easy Ui到底是什么呢? 我的理解就是比JQuery ui更强大,同样都是实现绚丽的多功能效果! jQuery Easy UI的目的就是帮助Web开发者更轻松的打

线段树数据结构详解

线段树数据结构详解 Coded by Jelly_Goat. All rights reserved. 这一部分是线段树. 线段树,顾名思义,是一种树形数据结构,适用于各种求区间统一算法的动静两平衡的数据结构. 这里什么是统一算法?(自己口胡的统一算法) 比如求最大值or最小值.区间求和,一样的区间都是一样的算法,这也是和动态dp不同的地方. 前置知识1:二叉搜索树 二叉搜索树就是根节点比左儿子大,比右儿子小的一种二叉树. 前置知识2:向量存储 向量存储是用来存完全二叉树儿子和父亲关系的. 如果

JQuery Easy Ui (Tree树)详解

在这里沉重悼念我辛辛苦苦写了4个小时的文章,因为我的失误,没保存,而夭折啦..... 我的痛苦谁能懂? 哎~~~~  吃一见长一智吧! 么的办法啊! 但是,但是!我狠了狠心,咬了咬牙!我决定,再写一遍!!! 谁知道哭的表情怎么写! 我已经无法用言语表达我此时此刻的沉重心情了! (以下内容,身为菜鸟的我是用颤抖的双手敲出来的,忘同志们珍惜!!!!) 记得4个小时之前,我写过一个随笔,它的内容是这样的: 每次写博客,都喜欢在前面和大家分享一些东西,今天要分享的是一个小故事: 一个世界著名的大酒店正在

java线程同步: synchronized详解(转)

Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行(如果多个线程调用同一个线程,只能有一个线程得到执行).另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 二.然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中

Linux设备树语法详解

Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写.引入了设备树之后,驱动代码只负责处理驱动的逻辑,而关于设备的具体信息存放到设备树文件中,这样,如果只是硬件接口信息的变化而没有驱动逻辑的变化,驱动开发者只需要修改设备树文件信息,不需要改写驱动代码.比如在ARM Linux内,一个.dts(device tree source)文件对应一个ARM的machine,一般放置在内核的

Trie树的详解及应用

Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高.Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的. Trie 的强大之处就在于它的时间复杂度.它的插入和查询时间复杂度都为 O(k) ,其中 k 为 key 的长度,与 Trie 中保存了多少个元素无关.Hash 表号称是

线段树 入门详解

概念(copy度娘): 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN).而未优化的空间复杂度为2N,因此有时需要离散化让空间压缩. 通俗地讲: 线段树就是把一个线段转变为一个二叉树,如下所示: 一个线段长度为4,则把它变成线段树,就是这个样子 这样如果你想改变一个区间的值,只用O(logn).比一般算法快了许多. 但是空间复杂度就会高一些,比如本来

Linux设备树语法详解【转】

本文转载自:http://www.cnblogs.com/xiaojiang1025/p/6131381.html 概念 Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写.引入了设备树之后,驱动代码只负责处理驱动的逻辑,而关于设备的具体信息存放到设备树文件中,这样,如果只是硬件接口信息的变化而没有驱动逻辑的变化,驱动开发者只需要修改设备树文件信息,不需要改写驱动代码.比如在AR

Gevent中的同步与异步详解

同步,异步概念 1.同步就是发生调用时,一定等待结果返回,整个调用才结束: 2.异步就是发生调用后,立即返回,不等待结果返回.被调用者通过状态.通知来通知调用者,或通过回调函数处理这个调用. 查询 1.同步查询 2.异步查询 同步异步与阻塞,非阻塞区别 1.阻塞/非阻塞, 它们是程序在等待消息(无所谓同步或者异步)时的状态: 2.同步/异步,是程序获得关注消息通知的机制. 同步异步与阻塞,非阻塞组合 1.同步阻塞 效率最低(日志程序). 2.同步非阻塞 效率也不高(需要轮询). 3.异步阻塞 一