level 1
原思路:先生成整个菜单树结构,再根据选择的角色读取本角色具有的菜单集,然后和菜单树比对,存在就把checked勾选上。但按文档说明,没有任何反映,不能勾选上本角色的菜单。
使用的是checkNode()方法设置,传进去的是json格式。
1、先把整个数从数据库中读取出来,生成树,这个没问题。
2、拿一条记录来测试,如下:
var zSelecteds = [
{id:10, pId:0,name:"系统管理"}
];
$(function() {
$.fn.zTree.init($("#treeDemo"), setting);
var treeObj = $.fn.zTree.getZTreeObj("treeDemo");
treeObj.checkNode(zSelecteds,true,true);
});
3、为何“系统管理”并没有默认勾选呢?????????郁闷,请帮忙看看
照文档说:
checkNode(treeNode JSON) 表示 需要勾选 或 取消勾选 的节点数据
2012年02月25日 09点02分
1
level 11
呵呵,看文档不仔细!文档中红色的字体是很重要的哟!
在 selectNode、treeNode 关于 zTreeNode 有以下说明:
请务必保证此节点数据对象 是 zTree 内部的数据对象
你应该利用 id 值从 zTree 内获取该节点的数据,再使用 checkNode 方法;
查找单个节点数据请看 getNodeByParam 方法
2012年02月25日 12点02分
2
level 1
谢谢ZTree答复。不是看文档不仔细,是一直没看明白“请务必保证此节点数据对象 是 zTree 内部的数据对象”这句话是什么意思。能否举个列子说明一下!!!!呵呵
我现在换一种方式实现的:
原来思路是取两次数据,即先取出整个树,再取出所查角色的json,根据checkNode把json传进去不就可以自动选择check了吗?
现在改为:直接根据角色信息查询出整个树(如果角色信息对应的那个菜单权限存在,那个组装json时增加属性:checked->true).最后把得到的这个json输出,即生成一棵已选择的角色权限树了。三层树,下面列子供参考。
String subMenuIds = this.baseService.findStringBySql("select menuid from t_sysroleurl where roleid='"+roleId+"'"); //100,102,104
String itemIds3 = this.baseService.findStringBySql("select urlid from t_sysroleurl where roleid='"+roleId+"'"); //1020,1024
List<Map<String,Object>> menuNodes = new ArrayList<Map<String,Object>>();
List list = this.authoInfoService.findAllMenu();
if(list.size()>0) {
Iterator<Object> it = list.iterator();
while(it.hasNext()){
Map m = (Map)it.next();
Map<String,Object> item = new HashMap<String,Object>();
item.put("id", m.get("f_code").toString());
item.put("name", m.get("f_name").toString().replaceAll(" ",""));
item.put("pId", m.get("f_pmenu").toString());
if(subMenuIds.contains(m.get("f_code").toString())){
item.put("checked", true);
}
if(itemIds3.contains(m.get("f_code").toString())){
item.put("checked", true);
}
menuNodes.add(item);
}
}
2012年02月25日 16点02分
3
level 11
1、直接在生成数据时就封装 checked 属性只要能实现还是很方便的,这样就省去了前台js 的操作。
2、关于对象问题给你简单讲解一下你就能明白了。
var a = {"id":1};
var b = {"id":1};
var c = a;
a == b?? a == c?? 你觉得这两个等式结果都是什么呢?
运行一下你能很快明白, a != b 这就是我说的原因,你一定要用 zTree 内部的数据对象进行操作,不能自己定义一个就拿过来。 zTree 是以数据为核心,你指定操作的对象需要核实在 zTree 内部存在才能进行,因为 zTree 还对数据有其它附加属性用于操作。
2012年02月26日 06点02分
4
level 5
我的实现方法(如果有更好的,请指教了):
专为zTree定义的一个普通javabean。
public class Node {
private int id;
private int pId;
private String name;
private boolean checked;
private boolean open;
public Node(){
checked=false;
open=false;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getpId() {
return pId;
}
public void setpId(int pId) {
this.pId = pId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean getChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
public boolean getOpen() {
return open;
}
public void setOpen(boolean open) {
this.open = open;
}
}
Action中遍历操作:
//角色分配菜单前查询所有菜单(包括所属菜单)
public String dtbFunction(){
try {
list=roleMenuDAO.secAllNodes();
for (int i = 0; i < list.size(); i++) {
AccessMenu menu=(AccessMenu)list.get(i);
Node node=new Node();
node.setId(menu.getMenuId());
node.setpId(menu.getParentMenuId());
node.setName(menu.getMenuName());
//
list3=roleMenuDAO.secMyNodes(role);
for (int j = 0; j < list3.size(); j++) {
accessRole_Menu=(AccessRole_Menu)list3.get(j);
if(menu.getMenuId()==accessRole_Menu.getMenu_id()){
node.setChecked(true);
node.setOpen(true);
//System.out.println(node.getName());
}
}
list2.add(node);
}
} catch (Exception e) {
addActionMessage(ISysParam.QUERY_LIST_NOT_NO);
e.printStackTrace();
}
return "jsonres";
}
求交流。。。。。。。。
2012年02月27日 07点02分
5
level 1
wnjustdoit的方式和我上面写的是一样的其实,都是在生成数据时就封装 checked 属性。
2012年02月28日 13点02分
7