posts - 404,  comments - 115,  views - 118万
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

项目中有发送消息功能,需要能通过搜索,多选用户,来指定发送人。使用 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对象。

 

posted on   怀素真  阅读(2086)  评论(0编辑  收藏  举报
编辑推荐:
· 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 重磅开源!
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示