项目中有发送消息功能,需要能通过搜索,多选用户,来指定发送人。使用 select2 插件来完成。
select2 的 html 代码如下:
1 2 3 4 5 6 7 8 | <div class = "form-group" id= "member_group" > <label class = "col-lg-3 control-label required" >选择用户 <span class = "required" >*</span> </label> <div class = "col-lg-4" > <select class = "form-control" name= "user_id[]" id= "member_select" multiple= "multiple" ></select> </div> </div> |
select2 的 js 代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | //选择用户 $( "#member_select" ).select2({ ajax: { //请求的URL url: "{{ route('member.index') }}" , //返回的数据类型 dataType: "json" , //延迟时间,毫秒 delay: 500, //是否缓存 cache: true, //查询数据 data: function (params) { //params.term就是你搜索输入的参数 return { search: params.term, page: params.page || 1 }; }, //请求结果回调函数,data就是后端返回的数据 processResults: function (data, params) { var data = data.data; var results = []; //循环数据,将数据压入results中 //注意数据必须要有二个属性,id和text,分别对应option的value和文本 //网上有些说无法选中元素,请先检查这里,你是否设置了id,并且不为空 $(data.data).each( function (i, obj) { results.push({ id: obj.id, text: obj.name }); }); return { results: results, pagination: { more: (data.current_page * data.per_page) < data.total } }; } }, placeholder: '选择用户' , //是否多选 multiple: true, allowClear: true }); |
后端返回的数据如下,直接使用 laravel 的 paginate() 方法 返回分页数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | { "status_code" :200, "message" : "查询成功" , "data" :{ "current_page" :1, "data" :[ { "id" :2006, "name" : "用户1" }, { "id" :2005, "name" : "用户3" }, { "id" :2004, "name" : "用户3" } ], "first_page_url" : "http://test.me/member/index?page=1" , "from" :1, "last_page" :1, "last_page_url" : "http://test.me/member/index?page=1" , "next_page_url" : "http://test.me/member/index?page=1" , "path" : "http://test.me/member/index" , "per_page" :1, "prev_page_url" :null, "to" :null, "total" :3 } } |
在编辑消息时,我们需要查看,这条消息发送给了哪些人,这就需要进入编辑页面时,让 select2 默认选中用户。
网上说通过如下方法可以选中。
1 | $( "#spread_select" ).val([1, 2]).trigger( "change" ); |
但是我们这里select2的option是通过ajax动态加载的,刚进页面时,select2的ajax根本没有触发,导致select2中没有option元素,更无法被选中。
我们通过下面的方式,来实现默认选中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | var selObj = [ { "id" : 1, "name" : "小徐" }, { "id" : 2, "name" : "小张" }, { "id" : 3, "name" : "小明" }, ]; ( function initSel(selObj) { if (selObj) { for ( var ix = 0; ix < selObj.length; ix++) { var item = selObj[ix]; var option = new Option(item.name, item.id, true, true); $( "#member_select" ).append(option); } $( "#member_select" ).trigger( 'change' ); } })(selObj); |
selObj中的数据,可以通过PHP后端生成好后,渲染到页面,然后通过JSON.parse()解析成JSON对象。
版权声明:博主文章,可以不经博主允许随意转载,随意修改,知识是用来传播的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决