java使用jQuery easyUI异步加载tree求教

Jwenzeng 2014-11-07 09:57:10
点击页面就只加载第 一级目录,点击一级目录就加载相应的子目录或节点,而不是一进页面就所有节点都加载了,数据内容是去数据库取得动态生成的。前面问了几次都没有好的实现方法,求各位大神们给个实现方法。我把现在只能一次加载的代码贴出来吧 ,至于配置什么的就不贴了,用到的就贴上
实体类部分
public class ResourceVO extends BasBizVO {
private static final long serialVersionUID = 1L;

private long id ;
private String name; // 名称
private String url;
private String description; //描述
private String icon;
private Long pid;
private String pname;
private String seq; //排序
private Integer state;
private Integer resourcetype; //是否默认
private Integer systemtype;

resourcetype; //是否默认类似于是否有子目录吧,它有两个状态菜单和按钮,菜单为0,按钮为1,但有的是菜单包括菜单,pid是上级资源,贴张图吧

SQL部分
<select id="queryResourceInfo" 
resultClass="com.file.sys.vo.ResourceVO"
parameterClass="java.util.HashMap">
SELECT
a.id ,
a.name,
a.url,
a.description,
a.icon,
a.pid,
b.name as pname,
a.seq,
a.state,
a.resourcetype,
a.systemtype
FROM sys_resource as a
left join sys_resource as b on a.pid=b.id
WHERE 1=1
<dynamic prepend="AND">
<isNotEmpty prepend="AND" property="id">
<![CDATA[a.id = #id#]]>
</isNotEmpty>
<isNotEmpty prepend="AND" property="name">
<![CDATA[a.name LIKE '%$name$%']]>
</isNotEmpty>
<isNotEmpty prepend="AND" property="resourcetype">
<![CDATA[a.resourcetype = #resourcetype#]]>
</isNotEmpty>
<isNotEmpty prepend="AND" property="state">
<![CDATA[a.state = #state#]]>
</isNotEmpty>
<isNotEmpty prepend="AND" property="systemtype">
<![CDATA[a.systemtype = #systemtype#]]>
</isNotEmpty>
</dynamic>
order by a.seq
</select>

Controller部分
public JsonView treeGrid(){
Map param=new HashMap();
QueryParam qp=QueryParam.getInstance2("sys.queryResourceInfo", param ,-1, -1);
List<OrgVO> list=this.getBasBS().query(qp);

return new JsonView(list);

}

"sys.queryResourceInfo"就是去执行查询语句
jsp部分
treeGrid = $('#treeGrid').treegrid({
url : '${ctx}/sys/resource/treeGrid',
idField : 'id',
treeField : 'name',
parentField : 'pid',
initialState:"collapsed",
fit : true,
fitColumns : false,
border : false,
frozenColumns : [ [
{
field : 'id',
title : '编号',
width : 80
},{
field : 'name',
title : '资源名称',
width : 200
} , {
field : 'url',
title : '资源路径',
width : 150
}
] ],
columns : [ [{
width : '150',
title : '上级资源',
field : 'pid'
}, {
field : 'seq',
title : '排序',
width : 60
},{
field : 'icon',
title : '图标',
width : 150
} ,{
field : 'state',
title : '状态',
width : 60,

},{
field : 'resourcetype',
title : '资源类型',
width : 100,
formatter : function(value, row, index) {
switch (value) {
case 1:
return '按钮';
case 0:
return '菜单';
}
}
} ,{
field : 'systemtype',
title : '子系统',
width : 100,
formatter : function(value, row, index) {
switch (value) {
case 0:
return '工程公共资源';
case 1:
return '总包工程资源';
case 2:
return '分包工程资源';
case 3:
return '查询统计资源';
case 4:
return '系统管理资源';
}
}
} ] ],


toolbar : '#toolbar'
});

该怎么该求助
...全文
1207 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jwenzeng 2014-11-09
  • 打赏
  • 举报
回复
引用 19 楼 luobaolin2008 的回复:
主要是后台那块,不知道怎么写
bench_888 2014-11-08
  • 打赏
  • 举报
回复
全是呆码,不懂,,,
火柴棍的坚强 2014-11-07
  • 打赏
  • 举报
回复
howsun_zh 2014-11-07
  • 打赏
  • 举报
回复
谢邀! 我曾经用过easyui tree,因此我只能用tree组件来解答,原理应该是相通的。 【服务端】: 表里好加上一个haschildren,表示是否有子数据 1、取数据 from ResourceVO where pid=? order by seq; 进入页面时,pid应该是null或0,这样就取到顶级树,当页面点击后,实际就传来了节点ID,这时pid=节点ID,就取出了子树,以此递归 2、组织数据 [{ "id":1, "text":name, "path":"", "...":"...", "state":"closed", }, {...} ] state的值就是根据haschildren字段值来判断,当有子节点其值就是closed,表示等待用户点击打开。 【客户端】

$(document).ready(function(){
		makeTree("subject");
});

function makeTree(id){
		$('#' + id).tree({
			animate: true,
			url: '/服务端地址/',
		});
}

<ul id="subject"></ul>
进入页面就执行makeTree()方法,这时请求远程时没有携带“id”参数过去,那么pid就为null,这样就取出了顶级树,当用户点击节点时,组件会自动发送ajax,并带上id过去,这时在服务端将接收的id值赋给pid,取出子树,以此递归。
tony4geek 2014-11-07
  • 打赏
  • 举报
回复
你都全部都有了。还怎么异步呢。 默认的时候就是查询最根节点的。在你代码上基础上再加个展开然后id传入就可以。
tony4geek 2014-11-07
  • 打赏
  • 举报
回复
引用 10 楼 sinat_22205873 的回复:
[quote=引用 8 楼 kky2010_110 的回复:] 擦,原来还是你
我也发现了,,懒羊羊大神,我比较菜,也没怎么接触过这个,卡这好久了,我后台方法只有这个啊,要不你加我QQ765039597,怎么感谢都行
public JsonView treeGrid(){
        Map param=new HashMap();
        QueryParam qp=QueryParam.getInstance2("sys.queryResourceInfo", param ,-1, -1); 
        List<OrgVO> list=this.getBasBS().query(qp);
         
        return new JsonView(list);
         
    }
[/quote] 哈哈你就从了吧。 默认不加条件,所有最外面的父节点查询出来。 然后点击 onBeforeExpand 的时候当前的id 传进去查询子节点。
Jwenzeng 2014-11-07
  • 打赏
  • 举报
回复
引用 8 楼 kky2010_110 的回复:
擦,原来还是你
我也发现了,,懒羊羊大神,我比较菜,也没怎么接触过这个,卡这好久了,我后台方法只有这个啊,要不你加我QQ765039597,怎么感谢都行
public JsonView treeGrid(){
        Map param=new HashMap();
        QueryParam qp=QueryParam.getInstance2("sys.queryResourceInfo", param ,-1, -1); 
        List<OrgVO> list=this.getBasBS().query(qp);
         
        return new JsonView(list);
         
    }
kky2010_110 2014-11-07
  • 打赏
  • 举报
回复
引用 7 楼 sinat_22205873 的回复:
[quote=引用 6 楼 kky2010_110 的回复:] onBeforeExpand : function(row, param) { $(this).treegrid('options').url = 'svnlog/repository.do?pid=row.id },
我试过了没用,你看效果还是全部加载了,所有节点都打开了[/quote] 你这不是废话吗?你的查询就是全部查出来的啊,你要先查父项目,在查子项目好吗? 比如这样

public JsonView treeGrid(String pid){
        Map param=new HashMap();
        QueryParam qp=QueryParam.getInstance2("sys.queryResourceInfo", param ,-1, -1); 
        List<OrgVO> list=this.getBasBS().query(qp,pid);//这里作条件查询,pid为空就查父类,不空就查子类
         
        return new JsonView(list);
         
    }
kky2010_110 2014-11-07
  • 打赏
  • 举报
回复
擦,原来还是你
Jwenzeng 2014-11-07
  • 打赏
  • 举报
回复
引用 6 楼 kky2010_110 的回复:
onBeforeExpand : function(row, param) {
$(this).treegrid('options').url = 'svnlog/repository.do?pid=row.id
},

我试过了没用,你看效果还是全部加载了,所有节点都打开了
kky2010_110 2014-11-07
  • 打赏
  • 举报
回复
onBeforeExpand : function(row, param) { $(this).treegrid('options').url = 'svnlog/repository.do?pid=row.id },
Jwenzeng 2014-11-07
  • 打赏
  • 举报
回复
引用 4 楼 sc6231565 的回复:
Magical茏 2014-11-07
  • 打赏
  • 举报
回复
虽然项目中也用easyui 但是还没有用到楼主这个组件
LOVE-漂泊 2014-11-07
  • 打赏
  • 举报
回复
引用 2 楼 sinat_22205873 的回复:
[quote=引用 1 楼 sizhouzhou 的回复:] 学习、、、、、
,能给个解决方法吗[/quote] 表示不懂
Jwenzeng 2014-11-07
  • 打赏
  • 举报
回复
引用 1 楼 sizhouzhou 的回复:
学习、、、、、
,能给个解决方法吗
LOVE-漂泊 2014-11-07
  • 打赏
  • 举报
回复
学习、、、、、
吉他猪 2014-11-07
  • 打赏
  • 举报
回复
默认是当展开节点的时候,他会自动将该节点的ID传递到后台. js代码

$(function() {
	$('#treeGrid').treegrid(
			{
				url : contextpath + '/cityTree/cityTree.do',
				idField : 'id',
				treeField : 'text',
				resizable : true,
				collapsible : true,
				height : $(document.body).height() - 2,
				width : 200 - 2,
				columns : [ [ {
					field : 'id',
					hidden : true,
					sortable : false
				}, {
					field : 'text',
					width : 190,
					sortable : false
				} ] ],
				onClickCell : function(field,row) {
					parent = row;
					if(0<row.id){
						$("#datagrid_list").datagrid('reload', {
						cityid : row.id,
					isdel : 0
					});}
				},
				onExpand : function(row){//默认第一次展开会去访问后台,如果想每次展开都去请求加上onExpand事件
					$("#datagrid_list").datagrid('reload', {
						cityid : row.id,
					isdel : 0
					});
				}

			});

})
Jwenzeng 2014-11-07
  • 打赏
  • 举报
回复
引用 17 楼 winters1224 的回复:

点错了 汗
我开始查询所有顶级节点,就是不知道怎么去判断他下面是否还有节点,查出来就变这样了
winters1224 2014-11-07
  • 打赏
  • 举报
回复
没用过jQuery easyui,不过思路其实简单。点击节点的时候,把当前节点的id传到后台,查出它的下一级子节点,然后展示出来。 初始化的时候就找顶级节点全部展示就ok
秋天998 2014-11-07
  • 打赏
  • 举报
回复
么有看懂 ,不知道怎么解决 求关注
加载更多回复(1)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧