权限管理实战:ztree异步加载+复选框联动最佳配置方案
你是不是也遇到过这种情况?明明给用户勾选了5个权限,保存时却只记录3个?或者展开权限树时页面卡成PPT?新手如何快速涨粉或许需要运营技巧,但搞不定这个ztree权限配置,怕是连系统都上不了线。我是那个曾经被甲方追着骂"权限树加载慢"的倒霉开发,今天掏心窝子分享实战经验。
(抓头发)先解决最要命的异步加载问题。上周给客户做RBAC权限系统,2000+节点直接加载把服务器干崩了。正确打开方式应该是这样的配置:
setting = {
async: {
enable: true,
url: "/load_nodes",
??autoParam: ["id=roleId","level"],??
??otherParam: {"systemType":"ERP"}??
}
}
这里埋着三个坑:
- ??autoParam传参必须带等号??,写成["id","roleId"]绝对报错
- ??otherParam是固定参数??,适合传系统类型等全局变量
- ??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: true | hasChildren: true | 子节点加载失败 |
checked: false | selected: 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配置就是说明书。别被满屏的参数吓到,其实核心就那五六个配置项。多手贱改几个参数试试,比看文档管用十倍。记住,测试时一定要用三级以上树结构,扁平数据发现不了问题!
本文由嘻道妙招独家原创,未经允许,严禁转载