分享

【ztree系列】完美实现复选框功能

 一本正经地胡闹 2019-05-23

       在权限系统中,大多数的页面都用到了树形结构,其中最常用的便是树资源的加载和单击事件,除此之外ztree还可以实现很多功能。今天以实现复选框的添加功能为例,咱们再来深入的学习下ztree的应用。

一、实例描述

       在用户管理模块中,需要给用户添加角色,而用户与角色的之间是一个多对多的关系。这里我们可以先加载两个角色树资源,通过两个树之间数据的交换,从而得到用户所拥有的角色资源,实现效果如下:

1.用户信息入口

2.加载角色信息

       Datagrid表格中的“分配”按钮是针对单个用户的角色分配,而搜索框下边的“批量分配角色”按钮是针对多个用户的角色分配,在实现过程中把二者结合在了一起。

1)如果选择的是一位用户,则右侧角色树“已分配角色”中是该用户已经拥有的角色,左侧角色树“可分配角色”中是除该用户拥有的角色之外所有的角色。

2)如果选择的是多位用户,则右侧角色树为空,左侧角色树是所有的角色

3.实现添加、移除等功能

       具体的功能实现由几个按钮完成,在上图中“添加、全部添加、移除、全部移除”四个按钮用来管理两个角色树之间的数据传输,与后台没有交互;“确定”按钮用来把页面的操作结果保存到数据库中;“重置”按钮负责角色分配窗口恢复到初始化状态。

       “确定”后,数据库中就保存了相应的用户角色信息。

二、具体实现

1.HTML中,先设计一个Windows窗口,用来盛放两个角色树

  1. <div id="groupDistributeRole" class="easyui-window" title="批量分配角色" style="width:700px;height:500px;padding:0px;" data-options="collapsible:false,minimizable:false,maximizable:false,modal:true" >
  2. <div class="easyui-layout" style="width: 630px; height: 370px; margin-top: 20px; margin-left: 20px; margin-right: 20px">
  3. @*1.左:所有的角色*@
  4. <div data-options="region:'west',title:'可分配角色',accordion:'false'" style="width: 260px;">
  5. <ul id="roleTree" class="ztree"></ul>
  6. </div>
  7. @*2.中:添加移除按钮*@
  8. <div id="RoleButton" data-options="region:'center'" style="width: 100px; border: 0px; font-size: 26px; text-align: center; margin-top: 60px">
  9. <a href="javascript:void(0)" class="easyui-linkbutton" onclick="addRole()">添 加 > </a>
  10. <a href="javascript:void(0)" class="easyui-linkbutton" onclick="addRoleAll()">全部添加>></a>
  11. <a href="javascript:void(0)" class="easyui-linkbutton" onclick="removeAddedRoleTree()"> < 移 除 </a>
  12. <a href="javascript:void(0)" class="easyui-linkbutton" onclick="removeAllAddedRole()"><<全部移除</a>
  13. </div>
  14. @*3.右:已分配的角色*@
  15. <div data-options="region:'east',title:'已分配角色'" style="width: 260px;">
  16. <ul id="addedRoleTree" class="ztree"></ul>
  17. </div>
  18. </div>
  19. <div class="easyui-panel" style="width: 686px; margin-top: 20px;border: 0px;">
  20. <div style="height: 50px;font-size: 26px; text-align: center;">
  21. <a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-ok'" onclick="RoleOk()">确定</a>
  22. <a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-undo'@*,plain:true*@" onclick="RoleReset()">重置</a>
  23. </div>
  24. </div>
  25. </div>
2、JavaScript

1)先获取Datagrid表格中的信息,判断选中的数据是一位用户还是多位用户,从而加载相应的角色树资源

  1. var rowData;
  2. function groupDistributeRole() {
  3. //获取选中信息的数据
  4. rowData = $(dg_student).datagrid("getSelections");
  5. //如果没有选中行的话,提示信息
  6. if (rowData.length == 0) {
  7. $.messager.alert("提示信息", "请选择要分配角色的用户!", 'info');
  8. return;
  9. }
  10. //打开分配角色的窗口
  11. $('#groupDistributeRole').window('open')
  12. addedRoleTree.pFunction.loadTree(); //加载角色树
  13. roleTree.pFunction.loadTree();
  14. }

2)两个角色树的加载代码

  1. var roleTree = {
  2. /**
  3. * 所有的初始化的操作
  4. */
  5. pFunction: {
  6. zTree: '',
  7. setting:
  8. {
  9. view: {
  10. showLine:false, //不显示连接线
  11. showIcon:false //不显示图标
  12. },
  13. check: {
  14. enable: true //显示复选框
  15. },
  16. data:
  17. {
  18. key:
  19. {
  20. name: "RoleName"
  21. },
  22. simpleData:
  23. {
  24. enable: true,
  25. idKey: "RoleId",
  26. rootPId: "0"
  27. }
  28. }
  29. },
  30. //加载资源
  31. loadTree: function () {
  32. if (rowData.length == 1) {
  33. $.post("/UserManage/QueryRoleExceptAddedRole", { userId: rowData[0].UserId }, function (roleInfo) {
  34. $.fn.zTree.init($("#roleTree"), roleTree.pFunction.setting, roleInfo);
  35. });
  36. } else {
  37. $.post("/UserManage/QueryAllRole", null, function (roleInfo) {
  38. $.fn.zTree.init($("#roleTree"), roleTree.pFunction.setting, roleInfo);
  39. });
  40. }
  41. }
  42. }
  43. };
  44. var addedRoleTree = {
  45. /**
  46. * 所有的初始化的操作
  47. */
  48. pFunction: {
  49. zTree: '',
  50. setting:
  51. {
  52. view: {
  53. showLine: false, //不显示连接线
  54. showIcon: false //不显示图标
  55. },
  56. check: {
  57. enable: true //显示复选框
  58. },
  59. data:
  60. {
  61. key:
  62. {
  63. name: "RoleName",
  64. },
  65. simpleData:
  66. {
  67. enable: true,
  68. idKey: "RoleId",
  69. rootPId: "0"
  70. }
  71. }
  72. },
  73. //加载资源
  74. loadTree: function () {
  75. if (rowData.length == 1) {
  76. $.post('/UserManage/QueryRoleByUserId', {userId:rowData[0].UserId}, function (roleInfo) {
  77. $.fn.zTree.init($("#addedRoleTree"), addedRoleTree.pFunction.setting, roleInfo);
  78. });
  79. } else {
  80. $.fn.zTree.init($("#addedRoleTree"), addedRoleTree.pFunction.setting); //加载一颗空的树
  81. }
  82. }
  83. }
  84. };
3)几个用来操作两个角色树的按钮实现
  1. //撤销操作
  2. function RoleReset() {
  3. //重新加载树
  4. addedRoleTree.pFunction.loadTree();
  5. roleTree.pFunction.loadTree();
  6. }
  7. //添加角色
  8. function addRole() {
  9. //获取被添加节点的树——addedRoleTree
  10. addedRoleObject = $.fn.zTree.getZTreeObj("addedRoleTree");
  11. roleObject = $.fn.zTree.getZTreeObj("roleTree");
  12. //nodes是一个array(json)数组,是所有被选中的节点
  13. var nodes = roleObject.getCheckedNodes(true);
  14. //把选中的节点,添加到已分配的角色中——addedRoleTree
  15. addedRoleObject.addNodes(null, nodes);
  16. //删除未分配角色中选中的节点——roleTree
  17. for (var l = nodes.length, i = l - 1; i >= 0; i--) {
  18. roleObject.removeNode(nodes[i]);
  19. }
  20. }
  21. //添加全部角色
  22. function addRoleAll() {
  23. //获取被添加节点的树——addedRoleTree
  24. addedRoleObject = $.fn.zTree.getZTreeObj("addedRoleTree");
  25. roleObject = $.fn.zTree.getZTreeObj("roleTree");
  26. //获取所有的节点信息——roleTree
  27. var nodes = roleObject.getNodes(); //nodes是一个array(json)数组,是所有被选中的节点
  28. //把选中的节点,添加到已分配的角色中——addedRoleTree
  29. addedRoleObject.addNodes(null, nodes);
  30. //删除未分配角色中所有的节点——roleTree(i--的删除有效,i++的删除会出现错误)
  31. for (var l = nodes.length, i = l-1; i >= 0; i--) {
  32. roleObject.removeNode(nodes[i]);
  33. }
  34. }
  35. //删除角色
  36. function removeAddedRoleTree() {
  37. //获取被添加节点的树——addedRoleTree
  38. addedRoleObject = $.fn.zTree.getZTreeObj("addedRoleTree");
  39. roleObject = $.fn.zTree.getZTreeObj("roleTree");
  40. //获取选中的节点信息——addedRoleTree
  41. var nodes = addedRoleObject.getCheckedNodes(true); //nodes是一个array(json)数组,是所有被选中的节点
  42. //把选中的节点,添加到可分配的角色中——RoleTree
  43. roleObject.addNodes(null, nodes);
  44. //删除已分配角色中选中的节点——addedRoleTree
  45. for (var l = nodes.length, i = l - 1; i >= 0; i--) {
  46. addedRoleObject.removeNode(nodes[i]);
  47. }
  48. }
  49. //删除全部角色
  50. function removeAllAddedRole() {
  51. //获取被添加节点的树——addedRoleTree
  52. addedRoleObject = $.fn.zTree.getZTreeObj("addedRoleTree");
  53. roleObject = $.fn.zTree.getZTreeObj("roleTree");
  54. //获取所有已分配的角色树中的节点信息——addedRoleTree
  55. var nodes = addedRoleObject.getNodes(); //nodes是一个array(json)数组,是所有被选中的节点
  56. //把已分配的角色信息,添加到可分配的角色中——RoleTree
  57. roleObject.addNodes(null, nodes);
  58. //删除已分配角色中的信息——addedRoleTree
  59. for (var l = nodes.length, i = l - 1; i >= 0; i--) {
  60. addedRoleObject.removeNode(nodes[i]);
  61. }
  62. }
4)保存功能,将页面的操作结果保存到数据库
  1. //保存操作
  2. function RoleOk() {
  3. //获取被添加节点的树——addedRoleTree
  4. addedRoleObject = $.fn.zTree.getZTreeObj("addedRoleTree");
  5. var nodes = addedRoleObject.getNodes();
  6. //把节点的RoleId放到一个数组中
  7. var roleArray = new Array;
  8. for (var i = 0; i < nodes.length; i++) {
  9. var obj = new Object;
  10. obj.RoleId = nodes[i].RoleId;
  11. roleArray.push(obj);
  12. }
  13. $.post(
  14. '/UserManage/AddUserRole',
  15. { userData: JSON.stringify(rowData), roleData: JSON.stringify(roleArray) },
  16. function (savaInfo) {
  17. //关闭分配角色窗口
  18. $('#groupDistributeRole').window('close');
  19. alert("保存成功!");
  20. });
  21. }
3.Controller中,是对js中用到的方法的具体调用过程,比较简单
  1. #region 根据用户Id,查找该用户没有的所有角色 王静娜2015年8月25日
  2. public ActionResult QueryRoleExceptAddedRole()
  3. {
  4. var UserId = Request.Form["userId"];
  5. Guid userId = new Guid(UserId);
  6. List<RoleViewModel> listRole = iUserManageService.QueryRoleExceptAddedRole(userId);
  7. var listTreeRole = listRole.Select(n => new
  8. {
  9. n.RoleId,
  10. n.RoleName
  11. }).ToList();
  12. return Json(listTreeRole, JsonRequestBehavior.AllowGet);
  13. }
  14. #endregion
  15. #region AddUserRole()添加用户角色 王静娜2015年8月27日
  16. public void AddUserRole()
  17. {
  18. //转换用户信息
  19. var UserData = Request["userData"];
  20. JavaScriptSerializer jsUser = new JavaScriptSerializer();
  21. List<UserViewModel> listUser = jsUser.Deserialize<List<UserViewModel>>(UserData);
  22. //转换角色信息
  23. var RoleData = Request["roleData"];
  24. JavaScriptSerializer jsRole = new JavaScriptSerializer();
  25. List<RoleViewModel> listRole = jsRole.Deserialize<List<RoleViewModel>>(RoleData);
  26. //调用服务端的添加方法
  27. iUserManageService.AddUserRole(listUser, listRole);
  28. }
  29. #endregion
三、总结

        ztree的学习主要是围绕文档来的,但是在实现的过程中还是会遇到各种小问题,随着这些问题的出现和解决,对它的认识也更深了一步。在实现ztree复选框功能的过程中主要用到的有以下知识点:

1.不显示树形结构,把所有数据当成一列来显示。平常实现树形结构需要同时设置idKey和pIdKey,这里只需设置idKey或让idKey=pIdKey即可

  1. simpleData:
  2. {
  3. enable: true,
  4. idKey: "RoleId",
  5. rootPId: "0"
  6. }

2.两个复选框

       想要实现ztree的复选框功能,首先要添加复选框,即setting.check.enable= true,但是在添加该功能后出现了两个复选框


       出现这样的情况是由于重复加载了复选框,我这里是因为多引入了一个js导致的

3.对树进行获取节点操作的返回结果是json串,它是一个array(json)数组,可以把它当成是数组来操作。

  1. //把节点的RoleId放到一个数组中
  2. var roleArray = new Array;
  3. for (var i = 0; i < nodes.length; i++) {
  4. var obj = new Object;
  5. obj.RoleId = nodes[i].RoleId;
  6. roleArray.push(obj);
  7. }

4.树节点的删除,nodes是要执行删除操作的节点,删除时要用i--操作,i++操作会导致节点的长度发生变化,从而找不到要删除的节点或漏删某些节点。

  1. //删除未分配角色中选中的节点——roleTree
  2. for (var l = nodes.length, i = l - 1; i >= 0; i--) {
  3. roleObject.removeNode(nodes[i]);
  4. }
小结:

       学习是一个循序渐进的过程,不断地尝试可以让我们遇到更多的问题,通过这些问题来学习不仅可以让我们了解的更多,还可以锻炼解决问题的能力,总有一天这些问题会越来越少也越来越有质量。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多