人员选择树,搜索自动筛选功能

article/2025/7/12 10:58:06

要实现的功能截图:
这里写图片描述

要求:
1、点击收件人输入框可以根据拼音自动筛选数据,并且标记已经选择的数据,没有结果的时候提示,相应的更新左边树节点状态
2、勾选树右侧树的节点左侧输入框出现一一对应的节点名称

用到的插件
vue+chosen+ztree
vue:组件化的MVVM库
chosen:基于jquery的单选列表和多选列表增强插件
ztree:基于jquery的树插件

分析
chosen插件已经可以实现要求1中的大部分效果,我们只需要预先提供chosen需要的数据,通过输入框值的变化实现左右两侧数据一 一对应,最后点击发送获取最终的数据集合ID

具体实现:
一、左侧选择数据,右侧树节点更新
chosen需要的html结构

//只需要提供包含数据的select标签即可,该select默认隐藏,chosen依据该数据构建新的html结构
<select name="dept" style="width:150px;" id="dept" class="dept_select" multiple="multiple"> //loop start<option value="部门1">部门1</option><option value="部门2">部门2</option><option value="部门3">部门3</option>//loop end
</select>//chosen初始化
$(function(){$('.dept_select').chosen({no_results_text:'没有结果',allow_single_deselect:true});
});

这样要求1中的大部分效果就实现了,option里面的数据我们需要通过接口从后台获取,这里采用vue解析数据,相应的html结构和js为:

//基于vue解析的html结构
<select data-placeholder="选择发件人" class="chosen-select form-control" tabindex="-1" multiple="multiple"><template v-for='key in zmailTree'><option v-for='item in key.userList' value='{{item.id}}'>{{item.name}}</option></template>
</select>//vue实例
var zmailForm=new Vue({el:'#zmail-form',ready:function(){var that=this;var getToken=$.cookie('dcValidate');$.ajax({  type:'get',async:false,url:'后台数据接口地址',dataType: "json",  success: function(msg){that.$set('zmailTree', msg);}});},data:{zmailTree:[]}
});
//总结:通过vue获取后台数据,将json数据赋值给zmailTree这个数组,它是含有层级结构的,我们不需要输出层级结构,只需要输出里面的人员就行了,但是实践中发现一个人问题,数据解析了,鼠标点击输入框出现的下拉列表中并没有出现我们刚才解析出来的数据,我们需要VUE的Vue.nextTick方法,延迟回调chosen初始化代码://延迟初始化chosen
Vue.nextTick(function () {$('#zmail-select').chosen({no_results_text: '没有找到该结果',// 当检索时没有找到匹配项时显示的提示文本search_contains: true //从任意位置开始检索});
});

然后出现了下面的效果:
这里写图片描述
接下来我们要做的就是勾选与左侧选择的数据相对应的节点。chosen提供了一个change方法,该方法当选择的值发生改变时触发,有这个方法我们就很容易根据select值的变化来勾选右侧树的节点

$('select.chosen-select').on('change', function(){// 用户改变了选择,快快处理
});

我们同样要写到Vue.nextTick中,其中涉及到树的操作请参照zTree API

//延迟初始化chosen
Vue.nextTick(function () {$('#zmail-select').chosen({no_results_text: '没有找到该结果',// 当检索时没有找到匹配项时显示的提示文本search_contains: true //从任意位置开始检索});$('#zmail-select').on('change', function(){//用户改变了值之后作如下处理var treeObj = $.fn.zTree.getZTreeObj("zmail-tree");//获取目标容器treeObj.expandAll(true);//展开所有树节点treeObj.checkAllNodes(false);//清空所有树节点$("#zmail-select option:selected").each(function(i,obj){//循环选择出来的数据//根据节点数据的ID属性搜索,获取条件完全匹配的节点数据,注:option中解析的是IDvar node = treeObj.getNodeByParam("id", obj.value, null);//将选出的节点全部勾选treeObj.checkNode(node, true, true);});});
});
//总结:输入框的值只要发生了改变option的状态就会自动更新,我们根据已选中的option的value(即ID),加上ztree已有的getNodeByParam方法来获取与左侧数据ID一一对应的树中的节点,然后通过checkNode方法勾选这些节点

到这里要求1中的效果我们就全部实现了。

二、勾选树节点,左侧输入框数据更新

//树的html结构,不要忘记写ztree这个class,否则不显示数据
<ul class="ztree" id="zmail-tree"></ul>
//--------树初始化代码js-----------
//人员树基本设置
var zmailTreeSet={view:{dblClickExpand:false},async:{enable:true,type:'get',url:'服务器数据地址',},data:{simpleData:{enable:true,idKey:'id',pIdKey:'parentId'},key:{children:'userList'}},check:{enable:true,chkboxType:{'Y':'s','N':'s'}},callback:{onCheck:zmailCheck}
};//勾选节点之后要处理的回调函数
function zmailCheck(){}//初始化人员树
$.fn.zTree.init($('#zmail-tree'),zmailTreeSet);

zmailCheck方法中实现的思路
(1)首先获取点击复选框的节点

var zmaObj = $.fn.zTree.getZTreeObj(treeId);//getZTreeObj插件方法,获取目标ID
var zmaNodes = zmaObj.getCheckedNodes(true);//getCheckedNodes获取输入框被勾选的节点集合

(2)其次清空select中的选中状态,将其恢复到初始状态,

$("#zmail-select option").each(function(j,obj){
obj.selected='';
});

(3)根据勾选的节点集合使select中的相应option选中,此处判断的关键是数据id

for(var i = 0;i < zmaNodes.length; i++){if(typeof(zmaNodes[i].userList) == 'undefined'){//如果该节点的userList属性为空说明不是父节点,存取它的值,如果不为空则跳过//不写判断,直接使用勾选的树的数据的ID来进行选择,使其属性select改为selected//$('').attr('selected',true)或者.attr('selected','selected')不起作用不知道为啥$('#zmail-select option[value="+zmaNodes[i].id+"]')[0].selected='selected';}
}

(4)更新select option列表

//循环外更新select列表
$("#zmail-select").trigger('chosen:updated');

完整的zmailCheck()代码为:

function zmailCheck(){
var zmaObj = $.fn.zTree.getZTreeObj(treeId);var zmaNodes = zmaObj.getCheckedNodes(true);$("#zmail-select option").each(function(j,obj){obj.selected='';});for(var i = 0;i < zmaNodes.length; i++){if(typeof(zmaNodes[i].userList) == 'undefined'){$("#zmail-select option[value="+zmaNodes[i].id+"]")[0].selected='selected';}}$("#zmail-select").trigger('chosen:updated');
}

至此要求2的效果我们也实现了。

总结
这个功能的完成离不开对zTree和chosen这两个插件的熟练使用,chosen用到的API为change方法、chosen:updated方法,ztree用到的方法为:getNodeByParam(),checkNode(),getCheckedNodes(),checkAllNodes(),expandAll()。
实现左侧=》右侧功能关键点:选出option的selected状态id,通过getNodeByParam()获取含有该ID的所有节点,然后使用checkNode()使这些节点的状态变为选中;
右侧=》左侧实现的关键点:通过getCheckedNodes()获取所有选中的节点,根据选中的节点ID使左侧的select下的option selected状态变为true,循环结束后(’chosen:updated’)更新option列表。

这个功能还有不完美的地方,那就是获取后台数据那里,我说过后台数据是有层级的,我现在只循环了两次,只取出了二级列表,如果层级有三级四级五级那获取的还是二级列表,vue我也刚开始学,不知道循环后台数据那里如何一劳永逸的获取不带层级的所有后续动态添加的子级列表。
为了便于讨论给大家看下我从后台获取的json数据:

[{"id": "20160912113609940493862810692577", "name": "xx公司", "parentId": "0", "userList": [{"id": "20160912113613185306623590148664", "name": "演示帐号"}, {"id": "20160912113613154939672576045528", "name": "成员1"}, {"id": "20160919121104625924937109002003", "name": "成员2"}]}, {"id": "20160912113611625082971312564873", "name": "组1", "parentId": "20160912113609940493862810692577", "userList": [{"id": "20160912113613138161662196502779", "name": "成员1"}, {"id": "20160912113613044493434182821910", "name": "成员2"}, {"id": "20160912113613169436263538841431", "name": "成员3"}, {"id": "20160912113613169255388288458627", "name": "成员4"}, {"id": "20160912113613185135119969199907", "name": "成员5"}]}, {"id": "20160912113611625563131574216031", "name": "组2", "parentId": "20160912113609940493862810692577", "userList": [{"id": "20160912113613044536244270423866", "name": "成员1"}, {"id": "20160912113613044570977235101231", "name": "成员2"}, {"id": "20160912113613044945364721175243", "name": "成员3"}, {"id": "20160912113613138666099077077505", "mobileNum": "000256364", "name": "成员4"}, {"id": "20160912113613154114377983132349", "name": "成员5"}, {"id": "20160912113613169433129887352698", "mobileNum": "0004210919", "name": "成员6"}, {"id": "20160912113613169883649070173455", "name": "成员7"}, {"id": "20160912113613185006644025528363", "name": "成员8"}, {"id": "20160912113613185400355507045112", "name": "成员9"}]}, {"id": "20160919115007372634170390528661", "name": "组3", "parentId": "20160912113609940493862810692577", "userList": [{"id": "20160914151121249285889869855783", "name": "成员1"}, {"id": "20160912113613060689705413198400", "name": "成员2"}, {"id": "20160912113613060223674583460143", "name": "成员3"}, {"id": "20160912113613154692470389028360", "mobileNum": "00032549532", "name": "成员4"}]}
]

http://chatgpt.dhexx.cn/article/b7UPNUGv.shtml

相关文章

级联选择器el-cascader处理复杂数据(四层、五层数据),回显部门以及部门下的人员

注意&#xff1a;参考第五层的数据处理比较nice 当级联选择器需要绑定的数组不再是简易数据&#xff0c;props涉及的字段不再是一个&#xff0c;而是列表里面套列表 比如&#xff0c;我想要获取部门以及下面的员工&#xff0c;如何显示&#xff1f;如下图1所示&#xff0c;后…

一个简单的联系人及组织架构选择人员的实现

前言&#xff1a;技术实现&#xff1a;Vitevue3tsvant。 本次主要是因为本人说了一个类似的功能&#xff0c;前期遇到了很多坑&#xff0c;导致 进度缓慢。虽然可以实现&#xff0c;但是都基于多个数组操作的情况&#xff0c;当涉及功能修改或优化&#xff0c;就很难实现了。 本…

jQuery仿钉钉组织架构的选择部门功能,移动端完美树形图

在网上找了好久&#xff0c;实在没见到有类似的只能自己写一个一、功能如图所示&#xff0c;点击选择无限下级功能 二、css <style>body{margin:0;padding:0;background:#ffffff}.spaceBetween {display: flex;justify-content: space-between;align-items: center;}.su…

vue的el-tree实现部门人员的tree展示选择,包括根据已有id进行默认选中设置

根据部门和人员&#xff0c;生成部门人员选择树&#xff0c;用的是Vue的el-tree生产树。 java部分------------------------------------------------------------------------------- 1&#xff1a;中间实体dto&#xff08;就是前端要的字段&#xff0c;让从数据库中查询的时…

Java+zTree审批人员选择

实现一个类似于钉钉审批人员选择的功能。 这里使用zTree实现组织架构树。 实体类需要有id,pId实现上下级关系。 company.java getter/setter略。 private int company_id;//公司idprivate String company_name;//公司名称private String remark;//备注信息private String f…

element-tree 实现部门-人员选择(支持ID相同)

使用element-tree实现id相同的选择 相同人员可在不同部门出现, 当勾选其中一个人员时,其它部门的相同人员也要勾选上右侧可进行删除已勾选人员, 并且树状图勾选状态取消若有勾选,进入时候默认选中 效果如下: 例如: 点击勾选总经办的王五,技术部的王五也要勾选上,右侧删除王五…

【Mobile Org】适用于移动端/H5的组织部门/角色/人员选择组件

Mobile Org Introduction 移动端组织架构数据选择方案&#xff0c;包括组织机构、角色以及人员等分类&#xff0c;支持单选、多选、关键字段自定义以及多种事件及插槽等&#xff0c;适用于大部分组织选人场景。 支持懒加载回调&#xff0c;点击获取当前组织下的子组织及人员…

使用VUE自定义组件封装部门选择功能

背景 照惯例&#xff0c;先交待下背景&#xff0c;从真实需求出发&#xff0c;讲述实现效果、设计思路和实现方式。 软件系统中&#xff0c;会有一些常见常用的选择功能&#xff0c;如部门选择、人员选择等&#xff0c;用于填报表单&#xff0c;使用频率很高。直接使用一方面会…

选择部门(多层级)下人员

一、顶部部门选中标题栏&#xff08;部门面包屑&#xff09; 1.使用水平滚动的ListView&#xff08;HorizontalListView&#xff09;&#xff0c;代码搜索一下就能找到&#xff0c; 2.右监听可以使用符号文字>&#xff08;代码&#xff1a;>&#xff09;&#xff0c;也…

阿里云成立13年首次实现年度盈利;iPhone14有望实现息屏显示;Android 13将采用华为研发的只读文件系统 |EA周报...

EA周报 2022年5月27日 每个星期7分钟&#xff0c;元宝带你喝一杯IT人的浓缩咖啡&#xff0c;了解天下事、掌握IT核心技术。 周报看点 1、成立13年首次年度盈利&#xff0c;阿里云2022财年赚11亿 2、博通官宣610亿美元收购VMware 3、Android 13 将默认采用华为开发的只读文件系统…

【ELT.ZIP】OpenHarmony啃论文俱乐部—数据密集型应用内存压缩

本文出自ELT.ZIP团队&#xff0c;ELT<>Elite(精英)&#xff0c;.ZIP为压缩格式&#xff0c;ELT.ZIP即压缩精英。成员&#xff1a; 上海工程技术大学大二在校生合肥师范学院大二在校生清华大学大二在校生成都信息工程大学大一在校生黑龙江大学大一在校生华南理工大学大一在…

Nydus 镜像扫描加速

文&#xff5c;余硕 上海交通大学22届毕业生 阿里云开发工程师 从事云原生底层系统的开发和探索工作。 本文 6369 字 阅读 16 分钟 GitLink 编程夏令营是在 CCF 中国计算机学会指导下&#xff0c;由 CCF 开源发展委员会&#xff08;CCF ODC&#xff09;举办的面向全国高校学生的…

定了,6大领域93个开源任务,阿里开源导师带你参与中科院开源之夏2022

今年&#xff0c;由阿里巴巴开源导师参与的30个核心开源社区再次加入中国科学院软件研究所开源软件供应链点亮计划支持下的系列高校开源活动——开源之夏2022&#xff0c;共开放93个开源任务。通过本活动&#xff0c;同学们可以在顶级开源导师的指导下&#xff0c;通过3个月的时…

龙蜥操作系统 Anolis OS 8.6 - 来自阿里云的 CentOS 8 100% 兼容发行版

请访问原文链接&#xff1a;https://sysin.org/blog/anolis-os-8/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org Anolis OS 8 是 OpenAnolis 社区推出的完全开源、中立、开放的发行版&#xff0c;它支持多计算架构&#x…

remove是什么意思计算机语言,remove是什么意思?remove是什么意思?

remove()是C语言中的函数&#xff0c;一般作用是删除数组、链表对象所有的元素。函数原型是intremove(char*filename)。 函数功能 remove()函数用于删除指定的文件&#xff0c;其原型如下&#xff1a; int remove(char *filename); 函数声明2&#xff1a; templateinline bool …

Linux 知:文件系统

文章目录 1. 前言2. 文件2.1. 一切皆文件2.2. 文件属性2.3. 目录结构2.4. 文件路径 3. 文件系统3.1. 文件系统种类3.2. 文件系统特性3.2.1. 格式化3.2.2. 格式 3.3. EXT 族文件系统3.3.1. EXT2 文件系统3.3.1.1. data block&#xff08;数据区块&#xff09;3.3.1.2. inode tab…

8 亿邮件地址泄露,源于邮件验证服务;腾讯推出微信公众号直播工具

(给技术最前线加星标&#xff0c;每天看技术热点) 转自&#xff1a;开源中国、solidot、cnBeta、腾讯科技、快科技等 【技术资讯】 0、8 亿邮件地址遭泄露&#xff0c;源于邮件验证服务 近日&#xff0c;Security Discovery 安全研究人员 Bob Diachenko 发现了一个150 GB 大小、…

LWN: 5.17 合并窗口第一部分!

关注了就能看到更多这么棒的文章哦&#xff5e; 5.16 Merge window, part 1 By Jonathan CorbetNovember 4, 2021DeepL assisted translationhttps://lwn.net/Articles/874683/ 截止到撰写此文的时候&#xff0c;Linus Torvalds 已经为 5.16 版本内核而向内核合入了 6800 个 no…

Linux出现Read-only file system错误解决方法

执行命令时遇到如下错误 这个问题是文件系统受损导致得&#xff0c;fstab文件未正确配置 解决方法&#xff1a; df -hT  #查看一下分区及挂载信息 fsck -a /dev/sda3  -a &#xff1a;检查文件系统&#xff0c;有异常便自动修复 执行完毕之后重启服务器 reboot 进入服务器&…

只需 6 步,你就可以搭建一个云原生操作系统原型

编者按&#xff1a;过去的三年对基础软件领域来说是不平凡的三年&#xff0c;是波涛汹涌的三年。随着国际形势和行业格局的变化&#xff0c;大家一定充分感受到了云原生和操作系统这两个话题的热度。那么当云原生和操作系统这两个热点话题相遇的时候&#xff0c;会发生什么故事…