加载树两种方式说明

加载树两种方式:
一次性加载树; -- 和数据库交互一次
点击事件加载树; -- 和数据库交互很多次 -- 根据需求加载树

如果树上的数据比较多,则过多的数据会过早的在内存中,如果数据比较少,是比较好的选择;

点击事件加载树;
提供一个方法传递父节点得到子节点数据;
@Repository("menuitemDao")
public class MenuitemDaoImpl extends CommonDaoImpl<Menuitem> implements MenuitemDao<Menuitem>{
public Collection<Menuitem> getSubMenuitemsByPid(Long pid) {
// TODO Auto-generated method stub
return this.hibernateTemplate.find("from Menuitem where pid=?",pid);
}
}
action中提供方法:
public String showSubMenuitem() throws Exception{
// if(true){
// throw new RuntimeException("aaaaa");
// }
//int a = 1/0;
this.menuitemList = this.menuitemService.getSubMenuitems(this
.getModel().getPid());
return SUCCESS;
}
然后Z在页面上:
js代码是:提供方法===获取Root和获取SubMenuitem:
/**
* 点击事件加载树
* 1、当请求menuitem.html页面的时候,加载根节点
* 2、当点击树上的节点的时候,触发事件:加载该节点的子节点
*/
loadRoot: function(){
$.post("menuitemAction_showSubMenuitem.action", {
pid: 0
}, function(data){//创建树
tree.zTree = $("#tree").zTree(tree.setting, data.menuitemList);
});
},
/**
* 根据父节点加载子节点
*/
loadSubMenuitems: function(){
if (!tree.zTree.getNodeByParam("pid", tree.treeNode.mid)) {//点击的节点没有子节点
$.post("menuitemAction_showSubMenuitem.action", {
pid: tree.treeNode.mid
}, function(data){//把子节点的数据追加到父节点上
//当执行该回调函数的时候,创建树的代码已经执行了
tree.zTree.addNodes(tree.treeNode, data.menuitemList, true);
});
}
}
数据获得之后怎么展示,需要写回调函数;callback
根据提供的demo里面可以看到,点击一个item触发的expand事件:
事件全部写在回调函数里面;
/**
* 加载树
*/
setting: {
isSimpleData: true,
treeNodeKey: "mid",
treeNodeParentKey: "pid",
showLine: true,
root: {
isRoot: true,
nodes: []
},
callback: {//事件
//当该事件执行的时候,树已经加载出来了
expand: function(event, treeId, treeNode){
/**
* event鼠标事件
* treeId 树的容器的ID
* treeNOde当前点击的节点
*/
tree.treeNode = treeNode;

tree.loadSubMenuitems();
}
}
},
查找事件中的api上,expand上有三个参数:expand(event, treeId, treeNode)
用户在使用 zTree 的页面上,编写 onExpand(event, treeId, treeNode) 函数(函数名可以自定义),并配置在 setting 的 callback 参数内,即可监听 zTree 的 expand 事件。
该事件在节点被鼠标点击导致展开后触发。
js中的方法执行情况是声明,再触发,如果不是声明式方式进行代码,就不确定是否已经加载;

需要把子节点的数据加到父节点上;
操作:addNodes 方法在哪个类上,
值如果需要其他地方使用就需要在外部有声明,才可以使用;
$.post("",,)后面的函数是只有成功响应的时候才触发的;
整个js中异步函数和其他代码之间是有影响的;
比如这里的加载Root和Sub是有影响的,怎么确定Root加载完成了;
---
当js的一些代码要用到回调函数的数据的时候,这些代码放在哪里安全性最高?回调函数里面;
---
测试点击加载,发现是一直加载,
getNodeByParam(key, value)
返回值: JSON Object getNodeByParam(key, value)
这个方法可以获取指定属性下有没有指定值的数据,一个数据当成boolean类型就是true了;
loadSubMenuitems: function(){
if (!tree.zTree.getNodeByParam("pid", tree.treeNode.mid)) {//点击的节点没有子节点
$.post("menuitemAction_showSubMenuitem.action", {
pid: tree.treeNode.mid
}, function(data){//把子节点的数据追加到父节点上
//当执行该回调函数的时候,创建树的代码已经执行了
tree.zTree.addNodes(tree.treeNode, data.menuitemList, true);
});
}
}
以后的开发可能遇到很多异步加载的问题;
$.post(url,data,function(data){
$.post(url,data,function(data){
………………
});
})
可能会有很多嵌套,很多层;

posted @ 2014-03-03 17:05  教程学习  阅读(521)  评论(0)    收藏  举报