完善layui-select功能与文档
This commit is contained in:
parent
afaa364499
commit
277cfb2e11
@ -0,0 +1,214 @@
|
||||
function LayuiSelect(layui) {
|
||||
let $ = layui.$;
|
||||
let form = layui.form;
|
||||
let ajax = top.restAjax;
|
||||
let dialog = top.dialog;
|
||||
let layuiSelectSelf = this;
|
||||
|
||||
/**
|
||||
* 下拉选择
|
||||
*/
|
||||
this.select = function (opt) {
|
||||
let self = this;
|
||||
let url = opt.url;
|
||||
let domId = opt.domId;
|
||||
let name = opt.name;
|
||||
let valueKey = opt.valueKey;
|
||||
let nameKey = opt.nameKey;
|
||||
let dataForm = opt.dataForm;
|
||||
let required = opt.required;
|
||||
let selectedValue = opt.selectedValue;
|
||||
let optionDataKeyArray = opt.optionDataKeyArray ? opt.optionDataKeyArray : [];
|
||||
let onInit = opt.onInit;
|
||||
let onSelect = opt.onSelect;
|
||||
|
||||
$('#' + domId).empty();
|
||||
$('#' + domId).append(`<select id="${name}" name="${name}" lay-filter="${name}Filter" ${required ? 'lay-verify="required"' : ''}></select>`);
|
||||
|
||||
/**
|
||||
* 初始化选项
|
||||
*/
|
||||
function initOption() {
|
||||
$('#' + name).empty();
|
||||
ajax.get(url, {}, null, function (code, data) {
|
||||
let options = '<option value="">请选择</option>';
|
||||
$.each(data, function (i, item) {
|
||||
let optionDatas = '';
|
||||
$.each(optionDataKeyArray, function (j, optionDataKey) {
|
||||
let optionDataValue = item[optionDataKey];
|
||||
if (!optionDataValue) {
|
||||
return;
|
||||
}
|
||||
optionDatas += ` data-data${j}="${item[optionDataKey]}"`;
|
||||
});
|
||||
options += `<option value="${item[valueKey]}" ${(selectedValue && selectedValue === item[valueKey]) ? 'selected' : ''} ${optionDatas}>${item[nameKey]}</option>`
|
||||
})
|
||||
$('#' + name).append(options)
|
||||
form.render(null, dataForm);
|
||||
|
||||
if (selectedValue) {
|
||||
// 监听初始化
|
||||
onInit ? onInit(selectedValue, layuiSelectSelf.selectedOption('#' + name, selectedValue)) : null;
|
||||
}
|
||||
}, function (code, data) {
|
||||
dialog.msg(data.msg);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化选择
|
||||
*/
|
||||
function initSelectEvent() {
|
||||
form.on('select(' + name + 'Filter)', function (data) {
|
||||
let option = self.selectedOption('#' + name, data.value);
|
||||
onSelect ? onSelect(data, option) : null;
|
||||
// 联动
|
||||
if (data.value) {
|
||||
onInit ? onInit(data.value) : null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
initOption();
|
||||
initSelectEvent();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 下拉数据字典
|
||||
* @param opt
|
||||
*/
|
||||
this.selectData = function (opt) {
|
||||
this.select({
|
||||
url: ajax.path('api/data/listbyparentid/{parentId}', [opt.parentId]),
|
||||
domId: opt.domId,
|
||||
name: opt.name,
|
||||
required: opt.required,
|
||||
dataForm: opt.dataForm,
|
||||
valueKey: 'dataId',
|
||||
nameKey: 'dataName',
|
||||
selectedValue: opt.selectedValue,
|
||||
optionDataKeyArray: opt.optionDataKeyArray,
|
||||
onInit: opt.onInit,
|
||||
onSelect: opt.onSelect
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取选择的option
|
||||
*
|
||||
* @param selectId 下拉框ID
|
||||
* @param selectedValue 选择的值
|
||||
* @return {DOMStringMap|null}
|
||||
*/
|
||||
this.selectedOption = function (selectId, selectedValue) {
|
||||
let options = $(selectId).children();
|
||||
for (let i = 0, option; option = options[i++];) {
|
||||
if (selectedValue === option.value) {
|
||||
return option;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 级联下拉
|
||||
* @param opt
|
||||
*/
|
||||
this.selectLinkage = function (opt) {
|
||||
let self = this;
|
||||
// 级联url
|
||||
let url = opt.url;
|
||||
// option key
|
||||
let valueKey = opt.valueKey;
|
||||
// option text key
|
||||
let nameKey = opt.nameKey;
|
||||
let optionDataKeyArray = opt.optionDataKeyArray && (opt.optionDataKeyArray instanceof Array) ? opt.optionDataKeyArray : [];
|
||||
// 级联数量
|
||||
let linkageSize = opt.linkageSize ? opt.linkageSize : 1;
|
||||
// 选择ID
|
||||
let selectId = opt.selectId;
|
||||
let baseRootId = opt.baseRootId;
|
||||
let onSelect = opt.onSelect && typeof (opt.onSelect) === 'function' ? opt.onSelect : null;
|
||||
|
||||
/**
|
||||
* 初始化
|
||||
* @param parentId 上级ID
|
||||
* @param selectIndex 选择下标
|
||||
*/
|
||||
function initSelect(parentId, selectIndex) {
|
||||
if (parentId === '') {
|
||||
return;
|
||||
}
|
||||
let refreshSelectId = (selectId + parseInt(selectIndex));
|
||||
ajax.get(ajax.path(url, [parentId]), {}, null, function (code, data) {
|
||||
$('#' + refreshSelectId).append('<option value="">请选择</option>');
|
||||
$.each(data, function (index, item) {
|
||||
// option携带的值
|
||||
let optionDatas = '';
|
||||
for (let i = 0, optionDataKey; optionDataKey = optionDataKeyArray[i++];) {
|
||||
let optionDataValue = item[optionDataKey];
|
||||
if (!optionDataValue) {
|
||||
continue;
|
||||
}
|
||||
optionDatas += ` data-data${i}="${item[optionDataKey]}"`;
|
||||
}
|
||||
$('#' + refreshSelectId).append(`<option value="${item[valueKey]}"${optionDatas}>${item[nameKey]}</option>`);
|
||||
});
|
||||
// 渲染表单下拉框
|
||||
form.render('select');
|
||||
}, function (code, data) {
|
||||
dialog.msg(data.msg);
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化级联事件
|
||||
* @param selectId 选择ID
|
||||
* @param size 级联长度
|
||||
*/
|
||||
function addLinkageEvent() {
|
||||
for (let i = 0; i < linkageSize; i++) {
|
||||
form.on('select(' + (selectId + i) + 'Select)', function (data) {
|
||||
let index = parseInt(data.elem.id.replace(selectId, ''));
|
||||
let nextIndex = index + 1;
|
||||
// 级联清空
|
||||
for (let j = nextIndex; j < linkageSize; j++) {
|
||||
$('#' + (selectId + j)).empty();
|
||||
}
|
||||
form.render('select');
|
||||
// 最后一个不触发初始化事件
|
||||
if (index < (linkageSize - 1)) {
|
||||
initSelect(data.value, nextIndex);
|
||||
}
|
||||
|
||||
if (onSelect) {
|
||||
let option = self.selectedOption('#' + data.elem.id, data.value);
|
||||
onSelect(data, option, index);
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
initSelect(baseRootId, 0);
|
||||
addLinkageEvent();
|
||||
}
|
||||
|
||||
/**
|
||||
* 地区级联下拉
|
||||
* @param opt
|
||||
*/
|
||||
this.selectLinkageArea = function (opt) {
|
||||
this.selectLinkage({
|
||||
url: 'api/area/listbyparentid/{parentId}',
|
||||
valueKey: 'areaId',
|
||||
nameKey: 'areaName',
|
||||
linkageSize: opt.linkageSize ? opt.linkageSize : 5,
|
||||
baseRootId: opt.baseRootId,
|
||||
selectId: opt.selectId,
|
||||
optionDataKeyArray: opt.optionDataKeyArray,
|
||||
onSelect: opt.onSelect && typeof (opt.onSelect) === 'function' ? opt.onSelect : null
|
||||
})
|
||||
}
|
||||
|
||||
}
|
14
docs/pom.xml
Normal file
14
docs/pom.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>wg-basic</artifactId>
|
||||
<groupId>ink.wgink</groupId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>docs</artifactId>
|
||||
|
||||
</project>
|
@ -0,0 +1,173 @@
|
||||
# 输入框树形选择
|
||||
|
||||
layui需要引入 **ztree** 模块
|
||||
|
||||
js
|
||||
|
||||
```html
|
||||
<script src="assets/js/common/layui-input-tree.js"></script>
|
||||
```
|
||||
|
||||
初始化
|
||||
|
||||
```js
|
||||
var layuiInputTree = new LayuiInputTree(layui);
|
||||
```
|
||||
|
||||
## 渲染
|
||||
|
||||
### 单选
|
||||
|
||||
html
|
||||
|
||||
```html
|
||||
<div class="layui-input-block">
|
||||
<input type="hidden" id="roleId">
|
||||
<input type="text" id="roleName" class="layui-input" placeholder="勾选角色">
|
||||
</div>
|
||||
```
|
||||
|
||||
js
|
||||
|
||||
```js
|
||||
layuiInputTree.initSelect({
|
||||
id: 'roleName',
|
||||
url: 'api/role/listztree',
|
||||
key: {
|
||||
id: 'roleId',
|
||||
name: 'roleName',
|
||||
title: 'roleName',
|
||||
pId: 'roleParentId',
|
||||
checked: 'checked',
|
||||
children: 'subs',
|
||||
isParent: 'isParent',
|
||||
isHidden: 'isHidden',
|
||||
url: 'url',
|
||||
},
|
||||
defaultParams: {id: '123123'},
|
||||
selectedData: {id: '', name: ''},
|
||||
onConfirm: function(zTree, selectedNode) {
|
||||
if(!selectedNode) {
|
||||
$('#roleId').val('');
|
||||
return;
|
||||
}
|
||||
$('#roleId').val(selectedNode.id);
|
||||
},
|
||||
onClear: function(zTree) {}
|
||||
})
|
||||
```
|
||||
|
||||
参数
|
||||
|
||||
|名称|类型|描述|是否必填|
|
||||
|---|---|---|---|
|
||||
|url|string|请求地址|是|
|
||||
|id|string|触发选择的input输入框ID|是|
|
||||
|key|obj|返回列表对象与ztree节点匹配的字段。id:节点id;name:名称;title:标题,pId:上级ID;checked:是否选中;isParent:是否父节点;isHidden:是否隐藏;url:节点链接。以上属性均为非必填|否|
|
||||
|defaultParams|obj|请求默认携带的参数|否|
|
||||
|getSelectedData|function|返回已经选择的数据|否|
|
||||
|onConfirm|function|点击确定按钮后触发|否|
|
||||
|onClear|function|点击清除按钮后触发|否|
|
||||
|
||||
方法
|
||||
|
||||
getSelectedData:返回ztree回显时的数据
|
||||
|
||||
事件
|
||||
|
||||
onConfirm:树形列表点击确定按钮后触发
|
||||
|
||||
|名称|类型| 描述 |
|
||||
|---|---|---------|
|
||||
|zTree|obj| ztree对象 |
|
||||
|selectedNode|obj| 选择的节点 |
|
||||
|
||||
onClear:树形列表点击清空按钮后触发
|
||||
|
||||
|名称|类型| 描述 |
|
||||
|---|---|---------|
|
||||
|zTree|obj| ztree对象 |
|
||||
|
||||
### 多选
|
||||
|
||||
html
|
||||
|
||||
```html
|
||||
<div class="layui-input-block">
|
||||
<input type="hidden" id="roleIds">
|
||||
<input type="text" id="roleNames" class="layui-input" placeholder="勾选角色">
|
||||
</div>
|
||||
```
|
||||
|
||||
js
|
||||
|
||||
```js
|
||||
var selectedRoles = [{id:'', name:''}]
|
||||
layuiInputTree.initMultiSelect({
|
||||
id: 'roleNames',
|
||||
url: 'api/role/listztree',
|
||||
key: {
|
||||
id: 'roleId',
|
||||
name: 'roleName',
|
||||
title: 'roleName',
|
||||
pId: 'roleParentId',
|
||||
checked: 'checked',
|
||||
children: 'subs',
|
||||
isParent: 'isParent',
|
||||
isHidden: 'isHidden',
|
||||
url: 'url',
|
||||
},
|
||||
checkboxType: {Y: '', N: ''},
|
||||
defaultParams: {id: '123123'},
|
||||
getSelectedDatas: function() {
|
||||
return [{id:'', name:''}]
|
||||
},
|
||||
onConfirm: function (zTree, selectedNodes) {
|
||||
// 将返回结果保存,回显时用
|
||||
if (selectedNodes.length == 0) {
|
||||
$('#roleIds').val('');
|
||||
return;
|
||||
}
|
||||
var roleIds = '';
|
||||
$.each(selectedNodes, function (index, item) {
|
||||
if (roleIds != '') {
|
||||
roleIds += ',';
|
||||
}
|
||||
roleIds += item.id;
|
||||
})
|
||||
$('#roleIds').val(roleIds);
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
参数
|
||||
|
||||
|名称|类型|描述| 是否必填 |
|
||||
|---|---|---|------|
|
||||
|url|string|请求地址| 是 |
|
||||
|id|string|触发选择的input输入框ID| 是 |
|
||||
|key|obj|返回列表对象与ztree节点匹配的字段。id:节点id;name:名称;title:标题,pId:上级ID;checked:是否选中;isParent:是否父节点;isHidden:是否隐藏;url:节点链接。以上属性均为非必填| 否 |
|
||||
|checkboxType|obj|复选框类型,Y 属性定义 checkbox 被勾选后的情况;N 属性定义 checkbox 取消勾选后的情况;"p" 表示作会影响父级节点;"s" 表示操作会影响子级节点。默认均为"ps"| 否 |
|
||||
|defaultParams|obj|请求默认携带的参数| 否 |
|
||||
|getSelectedDatas|function|返回已经选择的数据列表| 否 |
|
||||
|onConfirm|function|点击确定按钮后触发| 否 |
|
||||
|onClear|function|点击清除按钮后触发| 否 |
|
||||
|
||||
方法
|
||||
|
||||
getSelectedDatas:返回ztree回显时的数据列表
|
||||
|
||||
事件
|
||||
|
||||
onConfirm:树形列表点击确定按钮后触发
|
||||
|
||||
|名称|类型| 描述 |
|
||||
|---|---|-----------|
|
||||
|zTree|obj| ztree对象 |
|
||||
|selectedNodes|array| 触发选择的节点列表 |
|
||||
|
||||
onClear:树形列表点击清空按钮后触发
|
||||
|
||||
|名称|类型| 描述 |
|
||||
|---|---|---------|
|
||||
|zTree|obj| ztree对象 |
|
@ -0,0 +1,198 @@
|
||||
# 下拉选择
|
||||
|
||||
## 静态
|
||||
|
||||
### 表单
|
||||
|
||||
```html
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label"></label>
|
||||
<div class="layui-input-block">
|
||||
<select id="selector" name="selector" lay-filter="selectorSelect">
|
||||
<option value="">选择类型</option>
|
||||
<option value="type1">类型1</option>
|
||||
<option value="type2">类型2</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
### 列表搜索
|
||||
|
||||
```html
|
||||
|
||||
<div class="layui-inline layui-form search-item">
|
||||
<select id="type" name="type" lay-filter="typeFilter">
|
||||
<option value="">选择类型</option>
|
||||
<option value="type1">类型1</option>
|
||||
<option value="type2">类型2</option>
|
||||
</select>
|
||||
</div>
|
||||
```
|
||||
|
||||
## 动态
|
||||
|
||||
js
|
||||
|
||||
```js
|
||||
<script src="assets/js/common/layui-select.js"></script>
|
||||
```
|
||||
|
||||
初始化
|
||||
|
||||
```js
|
||||
var layuiSelect = new LayuiSelect(layui);
|
||||
```
|
||||
|
||||
### 单下拉
|
||||
|
||||
#### 通用
|
||||
|
||||
html
|
||||
|
||||
```html
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">最高学历</label>
|
||||
<input type="hidden" id="xxxName" name="xxxName">
|
||||
<div class="layui-input-block" id="xxxIdBox"></div>
|
||||
</div>
|
||||
```
|
||||
|
||||
js
|
||||
|
||||
```js
|
||||
layuiSelect.select({
|
||||
url: top.restAjax.path('', []),
|
||||
domId: 'xxxIdBox',
|
||||
name: 'xxxId',
|
||||
required: true,
|
||||
dataForm: 'dataForm',
|
||||
valueKey: 'dataId',
|
||||
nameKey: 'dataName',
|
||||
onSelect: function (data, option) {
|
||||
var optionValue = option.value;
|
||||
var optionText = option.innerText;
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
> xxx为需要替换的名称
|
||||
|
||||
#### 数据字典
|
||||
|
||||
js
|
||||
|
||||
```js
|
||||
layuiSelect.selectData({
|
||||
parentId: '',
|
||||
domId: 'xxxIdBox',
|
||||
name: 'xxxId',
|
||||
required: true,
|
||||
dataForm: 'dataForm',
|
||||
onSelect: function (data, option) {
|
||||
$('#xxxName').val(option.innerText);
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
参数
|
||||
|
||||
|名称| 类型 | 描述 | 是否必填 |
|
||||
|---|----------|----------------------------------------------------------|------|
|
||||
|url| string | 请求地址 | 是 |
|
||||
|domId| string | 加载下拉的div | 是 |
|
||||
|name| string | select的ID与NAME属性值 | 是 |
|
||||
|required| boolean | 是否校验 | 否 |
|
||||
|dataForm| string | 表单的lay-filter值 | 是 |
|
||||
|valueKey| string | 接口返回的数据渲染到option的value属性的值 | 是 |
|
||||
|nameKey| string | 接口返回的数据渲染到option的innerText的值 | 是 |
|
||||
|selectedValue| string | 选中的默认值 | 否 |
|
||||
|optionDataKeyArray| array | 需要附带在option上的属性值,取值的时候通过option.dataset.dataX 获取,其中X为数组下标 | 否 |
|
||||
|onInit| function | 渲染时触发回调 | 否 |
|
||||
|onSelect| function | 选择时触发回调 | 否 |
|
||||
|
||||
事件
|
||||
|
||||
onInit:渲染或更新时触发事件
|
||||
|
||||
|名称| 类型 | 描述 |
|
||||
|---|--------|----------------------|
|
||||
|selectedValue| string | 选中的默认值,空字符串时,不触发数据加载 |
|
||||
|option| dom | 默认选中的option |
|
||||
|
||||
onSelect:选择时触发事件
|
||||
|
||||
|名称|类型| 描述 |
|
||||
|---|---|----------------------------------|
|
||||
|data|obj| 选择的option数据,包含原始DOM,美化后的DOM,选中的值 |
|
||||
|option|dom| 选中的option |
|
||||
|
||||
### 下拉联动
|
||||
|
||||
#### 多级地区联动(示例)
|
||||
|
||||
> 树形结构,下拉联动需要配合dom实现
|
||||
|
||||
html
|
||||
|
||||
```html
|
||||
|
||||
<div class="layui-row" style="margin-top: 10px;">
|
||||
<span class="search-item-key">户籍地</span>
|
||||
<div class="layui-inline layui-form search-item ">
|
||||
<select id="registerArea0" name="registerArea0" lay-filter="registerArea0Select"></select>
|
||||
</div>
|
||||
<div class="layui-inline layui-form search-item ">
|
||||
<select id="registerArea1" name="registerArea1" lay-filter="registerArea1Select"></select>
|
||||
</div>
|
||||
<div class="layui-inline layui-form search-item ">
|
||||
<select id="registerArea2" name="registerArea2" lay-filter="registerArea2Select"></select>
|
||||
</div>
|
||||
<div class="layui-inline layui-form search-item ">
|
||||
<select id="registerArea3" name="registerArea3" lay-filter="registerArea3Select"></select>
|
||||
</div>
|
||||
<div class="layui-inline layui-form search-item ">
|
||||
<select id="registerArea4" name="registerArea4" lay-filter="registerArea4Select"></select>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
`<select>` 的 **id**、**name** 需要相同,下标从**0**开始,**lay-filter** 为 **id** 值 + **Select**。
|
||||
固定写法,下标递增
|
||||
|
||||
```js
|
||||
layuiSelect.selectLinkageArea({
|
||||
baseRootId: 0,
|
||||
selectId: 'registerArea',
|
||||
optionDataKeyArray: ['areaCode'],
|
||||
onSelect: function (data, option, index) {
|
||||
var value = data.value;
|
||||
// 删除元素
|
||||
selectedRegisterAreaArray.splice(index, 5 - index);
|
||||
if (value) {
|
||||
selectedRegisterAreaArray[index] = option.innerText;
|
||||
}
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
参数
|
||||
|
||||
|名称|类型|描述| 是否必填 |
|
||||
|---|---|---|------|
|
||||
|baseRootId|string|第一个下拉框的根节点ID| 是 |
|
||||
|selectId|string|select的ID(不包含下标)| 是 |
|
||||
|optionDataKeyArray|array|需要附带在option上的属性值,取值的时候通过option.dataset.dataX 获取,其中X为数组下标| 否 |
|
||||
|onSelect|function|选择事件| 是 |
|
||||
|
||||
事件
|
||||
|
||||
onSelect:选择时触发事件
|
||||
|
||||
|名称|类型| 描述 |
|
||||
|---|---|----------------------------------|
|
||||
|data|obj| 选择的option数据,包含原始DOM,美化后的DOM,选中的值 |
|
||||
|option|dom| 选中的option |
|
||||
|index|number| select下标 |
|
Loading…
Reference in New Issue
Block a user