因为项目中需要关联用户,且数据比较多,为了便捷操作,以及防止重名,需要能搜索的下拉框,使用了select2来完成这个功能。使用select2的方式与问题

引入

<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>

使用select2只需要这两个css,js,当然,jquery.js是必须的。
个人建议下载后,在用本地路径。

使用select2

下面展示一些 内联代码片

<div class="form-group row">
      <label class="col-sm-1 col-form-label">关联用户</label>
          <div class="col-sm-10">
               <select class="form-control select2"  id="userId">
				  <option value="1">张三-秦国</option>
				  <option value="2">李四-楚国</option>
				  <option value="3">王五-越国</option>
				  <option value="4">王者-赵国</option>
				  <option value="5">王舞-魏国</option>
				  </select>
           </div>
 </div>

效果

一般来说的话,这样就完成了,直接就有效果,也能输入搜索。但是,可能是与本来的css不兼容,我遇到了样式的问题。
如下,框里的张三“掉下来了”:

问题与解决

对应这个样式下坠的问题,直接修改了 select2.css 文件里面的——
在这里插入图片描述
.select2-container .select2-selection–single {}
这个样式的高度 height: 28px; 去掉。
这样就能正常显示了。

动态数据获取

select2与一般的select的数据有差异,它需要特定的格式
,官方的数据结构如下:

{
  "results": [
    {
      "id": 1,
      "text": "Option 1"
    },
    {
      "id": 2,
      "text": "Option 2"
    }
  ],
  "pagination": {
    "more": true
  }
}

需要id与text两个值,所以我们有前后端处理的两种方式。

第一种,前端处理

    $(function () {

        $('.select2').select2({
            ajax: {
                url: CONF_YDSURL + '/user/getNameList',
                success: function (result) {
                    //select2 需要的格式id,text
                    var arr = [];
                    $.each(result, function () {
                        arr.push({id: this.id, text: this.text})
                    })
                    $('#userId').select2({
                        placeholder: "请选择",
                        allowClear: true,
                        data: arr
                    });
                },
            }
        });

    });

循环设置好对应的id与text。

   //select2 需要的格式id,text
   var arr = [];
   $.each(result, function () {
   	arr.push({id: this.id, text: this.text})
   })

第二种,后端处理

 @RequestMapping("/getNameList")
    public List<HashMap<String, Object>> getNameList() {

        List<HashMap<String, Object>> list = new ArrayList<>();

        List<UserVO> userList = userService.getNameList();
        for (UserVO user : userList) {
            HashMap<String, Object> map = new HashMap<>();
            map.put("id", user.getId());
            map.put("text", user.getName());
            list.add(map);
        }
        return list;
    }

map分装好后,放入list中,数据结构就跟select2需要的一致了。

提交传值给后端

获取 select2 里id的值 $("#userId option:checked").val()即可。

使用了button 按钮 ,οnclick=“save()”

    function save() {
        var data = {
            "userId": $("#userId option:checked").val(),
            "code": $("#code").val()
            }
        $.post("/admin/userDevice/insert", data, function (data) {
            location.reload()
        });
    }

在编辑页获取数据库中的数据

//select2回显,newOption绑定id,而不是select2类
 var newOption = new Option(data.fullName, data.userId, true, true);
 $('#userId').append(newOption).trigger('change');

之前一直绑定了$(’.select’),结果一直不行,最后想到要绑定到id上
这是简单数据的一个小demo,服务器端过滤,或者数据量大需要分页需要用到 append()跟trigger()来加载,具体参考select2的官方文档:https://select2.org/.

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐