select2 github 仓库
小林工程师 dp-pro gitee 仓库
本文所使用的 select2 由小林工程师二次封装过.
dp-pro 的 select2 的bug
dp-pro 中的源码
1 2 3 4 5 6 7 8 9 10 11 12
| <h3> 省市区级联选择</h3> <div class="row"> <div class="col-md-4"> <select class="province form-control"></select> </div> <div class="col-md-4"> <select class="city form-control"></select> </div> <div class="col-md-4"> <select class="district form-control"></select> </div> </div>
|
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
| $('.province').selectBindEx({ url: '../../sys/area/select?areaCode=0', placeholder: '请选择省份', value: 'areaCode', text: 'name', change: function(data) { $('.city').selectBindEx({ url: '../../sys/area/select?areaCode=' + data, placeholder: '请选择地市', value: 'areaCode', text: 'name', change: function(data) { $('.district').selectBindEx({ url: '../../sys/area/select?areaCode=' + data, placeholder: '请选择区县', value: 'areaCode', text: 'name' }); } }); $('.city').val(null).trigger('change'); } });
$('.city').selectInitEx('请选择地市');
$('.district').selectInitEx('请选择区县');
|
dp-pro 中的 select2 有级联选择的 demo 但有一个问题就是:
设有 A-B-C 三个级联选项, 选中 A 后, B 填充对应的内容 B1, 这时再选中 A 中某项, B 中就会新增内容 B2, 而 B1 还存在着, 没被删去.
解决过程
首先, 在 change 事件中加入: $(‘.city’).empty();
一次点击多次请求
每点击一次 A 后再点击 B 都会产生比上次多一次的请求, 这是因为每次点击 A 都会让 B 绑定一个新事件, 这就导致了多一次点击就多一次请求, 并且会积累下去. 这样是很不合理的, 所以应该在为 B 注册新事件时把之前的事件注销掉.
点进 selectBindEx 可以发现里面绑定的事件名为 change, 所以只需要每次点击 A 把 B 的 change 注销掉就行
$(‘.city’).off(‘change’)
select 2 的显示与隐藏
有些时候需要动态控制下拉框的显示与隐藏, select2 与普通的下拉框有一点区别
普通下拉框只需要通过更改 css 来控制它的显示与隐藏, 如下:
1 2
| $('#select').css('display', ''); $('#select').css('display', 'none');
|
而这种方法对于 select2 是无效的, 需要通过它特定的方法
1 2
| $('#select2')..select2().next().show(); $('#select2')..select2().next().hide();
|
设置 select2 为只读
官方文档里的设置方法是:
1
| $('#select').select2("readonly", true);
|
但试了之后并不管用(可能是二次封装的问题), 还好官方给出的禁用选项是好使的:
1
| $('#select').select2("enable", false);
|
加载更多
参考链接
官方文档
为了减轻服务器负担, 结合实际情况一般都是在下拉框加载部分内容, 当用户下拉到底还有数据没加载时再向服务器发送请求.
前端: select2 设置
后台: 分页查询. 这个没啥好说的
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
| $('#select').select2({ theme: "bootstrap", language: "zh-CN", width: 'off', placeholder: '请输入关键字', ajax: { type: 'post/get', url: '请求链接', dataType: 'json', contentType : 'application/json', delay: 250, data: function(params){ if(params.term == null){ params.term = ''; } var keyword = params.term.split(/\s+/); var param = { name: keyword, pageNumber: params.page || 1, pageSize: 10, sortOrder: "asc", }; return JSON.stringify(param); }, processResults: function(r, params) { params.page = params.page || 1; var itemList = []; $.each(r.rows, function(idx, item) { itemList.push({id: item.id, text: item.name}); }); return { results: itemList, pagination: { more: r.pageNo<r.totalPages } } }, cache: true, }, minimumInputLength: 1 });
|