1. 主页 > 好文章

权限管理实战:ztree异步加载+复选框联动最佳配置方案

你是不是也遇到过这种情况?明明给用户勾选了5个权限,保存时却只记录3个?或者展开权限树时页面卡成PPT?新手如何快速涨粉或许需要运营技巧,但搞不定这个ztree权限配置,怕是连系统都上不了线。我是那个曾经被甲方追着骂"权限树加载慢"的倒霉开发,今天掏心窝子分享实战经验。

(抓头发)先解决最要命的异步加载问题。上周给客户做RBAC权限系统,2000+节点直接加载把服务器干崩了。正确打开方式应该是这样的配置:

setting = {
async: {
enable: true,
url: "/load_nodes",
??autoParam: ["id=roleId","level"],??
??otherParam: {"systemType":"ERP"}??
}
}
这里埋着三个坑:

  1. ??autoParam传参必须带等号??,写成["id","roleId"]绝对报错
  2. ??otherParam是固定参数??,适合传系统类型等全局变量
  3. ??dataFilter必须返回数组??,后端返回的{code:200,data:[]}要过滤掉外层包装

(拍桌子)复选框联动才是重灾区!上周实习生写的配置,勾选父节点竟然不自动选子节点。正确的check配置长这样:

check: {
enable: true,
??chkboxType: { "Y": "ps", "N": "ps" },??
??chkStyle: "checkbox"??
}
注意这两个参数:

  • ??Y代表选中时的关联逻辑??,p指父节点,s指子节点
  • ??ps组合表示半选状态联动??,改成"all"就全选/全不选

遇到过这种情况吗?勾选了10个权限,提交时却收到空数组。八成是忘了这个回调:

callback: {
??onCheck: function(event, treeId, treeNode){??
// 这里要手动更新隐藏域的值
var nodes = zTree.getCheckedNodes(true);
$("#permIds").val(nodes.map(n=>n.id));
}
}

(摔鼠标)最气人的是数据格式不对!对比下正确和错误的数据结构:

正确格式错误格式后果
id: 数字id: "001"节点无法关联
isParent: truehasChildren: true子节点加载失败
checked: falseselected: false复选框不生效

建议用这个数据转换模板:

function convertData(backendData) {
return backendData.map(item => ({
id: item.permId,
name: item.permName,
??isParent: item.hasChildren,??
??checked: item.selected,??
??open: item.expanded??
}));
}

有次凌晨两点调试,死活获取不到已选节点。最后发现少写了这个:

var zTree = $.fn.zTree.getZTreeObj("treeDemo");
??var nodes = zTree.getCheckedNodes(true);??
// 参数true表示包含半选节点

个人观点:权限管理就像拼积木,ztree配置就是说明书。别被满屏的参数吓到,其实核心就那五六个配置项。多手贱改几个参数试试,比看文档管用十倍。记住,测试时一定要用三级以上树结构,扁平数据发现不了问题!

本文由嘻道妙招独家原创,未经允许,严禁转载