EasyUI异步加载Tree实现(另类,简洁)

前言

前几天事情比较的多,回学校时候行李,邮寄包裹,归还图书准备毕业。之后又是入职体检,各种琐碎的小事,文章也停更了几次。今天正好有一些零碎的时间可以把之前的工作内容做一个总结整理。这篇文章就是关于EasyUI实现异步加载树的。

异步Tree

首先需明白的是这里所说的异步加载是一个宽泛的概念。以一个实际的树形菜单为例,一般情况下在数据量不大的时候,我们可以一次性的把数据加载出来,这是符合常理的。但是如果数据量大,更加合适的做法便是按树的层级,动态的加载某层级的数据,这样的一种描述就是这里所说的异步了,实现了这种操作方式的Tree则称为异步树。

理解了这些来看具体如何是实现。

前端代码

EasyUI本身就提供了Tree组件的,而且easyui的官网也提供了异步加载树的demo了,但是由于没有涉及到后台的数据交互,对于一些刚入门的童鞋来说实现的方式还是不够具体,这里我就借花献佛具体一把呗。

HTML

这里我使用html标记来定义树,代码如下:

//外层的div不用理会,出于布局的考虑
<div data-options="region:'west',split:true,border:true" style="width:160px" id="menu">
    <ul class="easyui-tree" id="mm-tree">
    </ul>
</div>

JS

之后使用js脚本对tree进行相关的初始化操作:

//初始化类别树
        $('#mm-tree').tree({
            url: 'mm/getMMTypeList?mmid=',
            onClick: function(node) {
                if (node != null) {
                    alert("显示物料类别ID为:" + node.id + "的物料列表");
                    $('#dgs').datagrid('reload');//根据点击的节点,更新其他数据
                }
            },
            onBeforeLoad: function(node, param) {
                if (node == null) {
                    $('#mm-tree').tree('options').url = "mm/getMMTypeList?mmid=";//加载顶层节点
                } else {
                    $('#mm-tree').tree('options').url = "mm/getMMTypeList?mmid=" + node.id;//加载下层节点
                }
            }
        });

后台代码

后台框架选中的是Spring MVC,读者如果使用其他框架参考其实现逻辑即可。其实初入门的童鞋实现异步tree的困惑不在于数据的获取,而在于数据的结构问题。说到底是对返回给前端EasyUI Tree的JSON格式不清楚。OK,一起看看easyui tree的json格式吧!还是从官网入手,我们就看官网的异步Tree的实现demo,地址如下:http://www.jeasyui.com/demo/main/index.php?plugin=Tree&theme=default&dir=ltr&pitem=

之后我们点击左侧菜单的“异步Tree”,按F12打开浏览器开发者工具,点击network即可看到如下内容:

找个线上的JSON美化工具美化下JSON格式即可,美化后的JSON就比较易懂了:

[
  {
    "id": "7",
    "text": "Node 1.1.1",
    "state": "open"
  },
  {
    "id": "8",
    "text": "Node 1.1.2",
    "state": "open"
  },
  {
    "id": "9",
    "text": "Node 1.1.3",
    "state": "open"
  }
]

不过这个是每一个节点加载的JSON数据,并没体现出各个节点的关系,还得去官网查阅其JSON格式。至于官网的JSON格式我这里就不在贴图了,自己构造比较的麻烦。这里我突发奇想参考以前看过的一篇文章看能否实现:

http://blog.csdn.net/weiweiai123456/article/details/21230735

按照该文章的思路,我们要根据数据库的关系去通过"_parentId"构建json格式,以下是我的后台代码:

 @RequestMapping("/mm/getMMTypeList")
	@ResponseBody
	public List<Map<String, Object>> getMMTypeList(
			@RequestParam("mmid") String mmid) {
		List<Map<String, Object>> nodes = mmFacade.getMMTypeListByMMCateGoryId(
				mmid).getObjList();
		List<Map<String, Object>> items = new ArrayList<Map<String, Object>>();
		for (Map<String, Object> node : nodes) {
			Map<String, Object> item = new HashMap<String, Object>();
			item.put("id", node.get("id"));
			item.put("text", node.get("categoryname"));
			// 该节点有子节点
			// 设置为关闭状态,而从构造异步加载tree
			if (mmFacade.hasChild(node.get("id").toString())) {
				item.put("state", "closed");
				item.put("iconCls", "icon-save");
			}
			items.add(item);
		}
		return items;
	}

思路比较的明显,默认加载的是顶层的节点,并根据其是否有子节点设置器开关状态。当前台点击了某个节点时,在根据节点的ID去加载下一层节点。依次类推,直到一层层的加载完毕。

撇开思路不提,这里需要确定的是EasyuiTree能否解析该JSON格式,答案当然是可以的啦,这里笔者亲自尝试了的,是可以的,如下图所示:

哈哈,这种通过添加一个_parentId的方式就能非常简单的构建Tree JSON格式了,是不是非常方便呢?至于这种方式的原理,我自己也没弄清楚呢,可以的话童鞋们可以补充解惑下!

EasyUI异步加载Tree实现(另类,简洁)

时间: 2024-10-21 10:49:30

EasyUI异步加载Tree实现(另类,简洁)的相关文章

EasyUI实现异步加载tree(整合Struts2)

首先jsp页面有一ul用于展现Tree <ul id="mytree"></ul> 加载Tree <script type="text/javascript"> $('#mytree').tree({ url:'treeLoad.action' }); </script> 配置Action <struts> <package name="tree_json" extends=&qu

【EasyUI学习-2】Easyui Tree的异步加载

作者:ssslinppp       1. 摘要 easyui相关的介绍可以上其官网或者百度去搜索,这里不做介绍. Easyui Tree的使用,官网或者easyui中文网站,也有相关介绍,但是官方提供的实例所使用的json是写死的,不是后台实时读取的.在实际的项目中,要显示的tree数据,一般都是从数据库中读取,然后通过通过ajax或者其他技术将tree的json数据发送到前台,然后显示. 本文将介绍easyui tree的异步加载,以及手动展开tree. 2. tree的相关介绍 上图是一个

jqxtree异步加载部门树

整体思路 A.要想实现异步加载第一次加载的是一级部门 B.加载一级部门,如果有子部门,部门前面带+号,没有子部门,部门前面没有+号(+号也就是点击可以展开) C.在sql中实现如果有子部门默认都加载一个子部门名称为“查询中...”的部门,id自己定唯一就行,这样就可以实现加载的一级部门到底前面带不带+号 D.当点击可以展开的部门时,将部门为“查询中...”的替换为异步查出来的部门 1.引入样式和js(差不多能用到的都引入吧以便以后能用到) <link rel="stylesheet&quo

Ztree异步加载自动展开节点

在Ztree的官网Demo中,有自动展开的例子,是通过设置节点属性open:true来实现自动展开的,但是在异步加载中,这个属性设置为true也不会自动展开,因为open:true是指在有子节点的情况下展开,在异步加载之前,当前节点是没有子节点的,所以无法打开.异步加载自动展开解决方法如下: 1.设置ztree的加载完成的回调函数: setting = {      ......                  callback: {        ......        onAsyncS

jQuery.treetable使用及异步加载

Usage 1 GitHub 地址 https://github.com/ludo/jquery-treetable/ 2 API 地址 http://ludo.cubicphuse.nl/jquery-treetable/ 3 jQuery 官网链接 http://plugins.jquery.com/treetable/ 引入代码: <link href="path/to/jquery.treetable.css" rel="stylesheet" typ

异步加载脚本保持执行顺序

首先是外部脚本和行内脚本,对于异步加载的脚本,会导致竞争状态,使得出现未定义的错. 采用Script Dom技术测试: 代码: <script type="text/javascript"> var scriptElem = document.createElement('script');  scriptElem.src = "js/jquery-2.1.1.js"; document.getElementsByTagName('head')[0].a

【zTree】简单实例与异步加载实例

[zTree]简单实例与异步加载实例 我们在项目中经常会需要用到树,这次按照数据库存储的特点重新了做一个小demo,使用zTree来实现这个功能. 简单实例: 首先我们需要在界面中引入代码,很简单,但是很重要,它用来存放加载的树. ps:添加ztree的引用,下载地址:http://www.ztree.me/v3/main.php#_zTreeInfo [html] view plain copy <span style="font-family:KaiTi_GB2312;font-siz

实现页面异步加载

应用场景 平时我们用的最多的网页加载方式就是同步加载模式,也称阻塞模式,这种模式虽然安全,但是对于设计比较繁琐的网页采用同步加载会使网页的加载时间大大加长,所以也就出现了下面用到的异步加载模式. 使用 异步加载可以使用 XHR Injection. XHR Eval. Script In Iframe. Script defer属性. document.write(script tag)等,我当前采用的的是Script DOM Element方法,也就是动态向页面创建script标签异步加载JS

好程序员web前端教程分享异步加载CSS的一些方法

好程序员web前端教程分享异步加载CSS的一些方法,在我们写页面的时候,我们做最主要的任务就是提高页面的性能和弹性加载速度,以不会延迟页面的呈现的形式来加载CSS.这是因为在默认情况下, - 浏览器会同步加载外部的CSS - 在下载和解析CSS时会影响所有页面呈现 这两种情况都会导致潜在的延迟. 当然,这也是在开始渲染页面之前,应该至少加载网站的CSS的一部分,并且为了立即将该初始CSS添加到浏览器,我们建议内联css.对于整体数量较少的网站,仅此一项就足够了,但如果CSS很大(例如,大于15到