LayUI—tree樹形結(jié)構(gòu)的使用解析
樹形結(jié)構(gòu)在實際開發(fā)中很長用到,比如部門管理,權(quán)限菜單等。因為用樹形結(jié)構(gòu)來展示會顯的很清晰明了。
最近寫了一個個人博客小項目中用到了LayUI的樹形結(jié)構(gòu),之后寫了一個小案例整理一下。
先看一下顯示的效果圖

點擊節(jié)點右面會顯示對應部門的詳情信息,可以修改??梢宰远x按鈕添加部門,也可以直接用自帶的方法對部門進行新增,修改和刪除。可以獲取選中的節(jié)點,根據(jù)項目需求(有的需要選中保存)。
先需要引入LayUI的樣式文件JS和CSS。
案例對應的實體類Dept
@Entity
public class Dept {
private Integer id;
private String name; //部門名稱
private String deptName; //部門負責人
private String phone; //電話號
private String number; //編號
private double idx; //排序
@JsonIgnore
private Dept parent;
@JsonIgnore
private List<Dept> children = new ArrayList<>();
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public double getIdx() {
return idx;
}
public void setIdx(double idx) {
this.idx = idx;
}
@ManyToOne
@CreatedBy
public Dept getParent() {
return parent;
}
public void setParent(Dept parent) {
this.parent = parent;
}
@OneToMany(cascade=CascadeType.ALL,mappedBy="parent")
@OrderBy(value="idx")
public List<Dept> getChildren() {
return children;
}
public void setChildren(List<Dept> children) {
this.children = children;
}
public Dept(Integer id, String name, String deptName, String phone, String number, double idx, Dept parent, List<Dept> children) {
this.id = id;
this.name = name;
this.deptName = deptName;
this.phone = phone;
this.number = number;
this.idx = idx;
this.parent = parent;
this.children = children;
}
public Dept(Integer id) {
this.id = id;
}
public Dept() {
}
}顯示LayUI樹形菜單,只需要一個標簽容器即可。
<div id="dept_tree"> </div>
在案例中還有一些其他樣式,比如右邊的詳情信息,新增按鈕等。
完整代碼如下
<style type="text/css">
#dept_main, #dept_particulars{
width: 48.5%;
display: inline-block;
vertical-align: top;
padding: 20px;
background: white;
box-sizing: border-box;
}
#dept_tree{
margin-top: 20px;
}
</style><div id="dept_main" style="margin-right: 2%;">
<fieldset class="layui-elem-field layui-field-title">
<legend>所有部門</legend>
</fieldset>
<button class="layui-btn layui-btn-sm layui-btn-radius layui-btn-normal" lay-demo="addDept"><i class="layui-icon"></i>添加部門</button>
<button class="layui-btn layui-btn-sm layui-btn-radius layui-btn-normal" lay-demo="gain">獲取選中節(jié)點</button>
<div id="dept_tree">
</div>
</div>
<div id="dept_particulars">
<fieldset class="layui-elem-field layui-field-title">
<legend>部門詳情</legend>
</fieldset>
<div id="dept_home">
<div class="layui-tree-emptyText">無數(shù)據(jù)</div>
</div>
</div>JS請求數(shù)據(jù)渲染頁面代碼,data為請求數(shù)據(jù)源,當時直接放入的請求鏈接,好像不行,所以之后才寫了一個方法去請求數(shù)據(jù)源。
layui.use(['tree', 'util'], function() {
var tree = layui.tree;
var util = layui.util;
tree.render({
elem: '#dept_tree',
data: getData(),
id: 'treeId',
showCheckbox: true, //是否顯示復選框
onlyIconControl: true
});
});
function getData(){
var data = [];
$.ajax({
url: "dept/treeload", //后臺數(shù)據(jù)請求地址
type: "post",
async:false,
success: function(resut){
data = resut;
}
});
return data;
}tree 組件提供的有以下基礎(chǔ)參數(shù),可根據(jù)需要進行相應的設置。
| 參數(shù)選項 | 說明 | 類型 | 示例值 |
|---|---|---|---|
| elem | 指向容器選擇器 | String/Object | - |
| data | 數(shù)據(jù)源 | Array | - |
| id | 設定實例唯一索引,用于基礎(chǔ)方法傳參使用。 | String | - |
| showCheckbox | 是否顯示復選框 | Boolean | false |
| edit | 是否開啟節(jié)點的操作圖標。默認 false。
| Boolean/Array | ['update', 'del'] |
| accordion | 是否開啟手風琴模式,默認 false | Boolean | false |
| onlyIconControl | 是否僅允許節(jié)點左側(cè)圖標控制展開收縮。默認 false(即點擊節(jié)點本身也可控制)。若為 true,則只能通過節(jié)點左側(cè)圖標來展開收縮 | Boolean | false |
| isJump | 是否允許點擊節(jié)點時彈出新窗口跳轉(zhuǎn)。默認 false,若開啟,需在節(jié)點數(shù)據(jù)中設定 link 參數(shù)(值為 url 格式) | Boolean | false |
| showLine | 是否開啟連接線。默認 true,若設為 false,則節(jié)點左側(cè)出現(xiàn)三角圖標。 | Boolean | true |
| text | 自定義各類默認文本,目前支持以下設定: text: { defaultNodeName: '未命名' //節(jié)點默認名稱 ,none: '無數(shù)據(jù)' //數(shù)據(jù)為空時的提示文本 } | Object | - |
因為tree指定了json數(shù)據(jù)的鍵名稱,所以后臺傳遞過來的數(shù)據(jù)對應的鍵名不一樣時需要做一下處理,或者實體類中的屬性名就和tree的JSON數(shù)據(jù)的鍵名稱一樣。
鍵名:
| 屬性選項 | 說明 | 類型 | 示例值 |
|---|---|---|---|
| title | 節(jié)點標題 | String | 未命名 |
| id | 節(jié)點唯一索引,用于對指定節(jié)點進行各類操作 | String/Number | 任意唯一的字符或數(shù)字 |
| children | 子節(jié)點。支持設定選項同父節(jié)點 | Array | [{title: '子節(jié)點1', id: '111'}] |
| href | 點擊節(jié)點彈出新窗口對應的 url。需開啟 isJump 參數(shù) | String | 任意 URL |
| spread | 節(jié)點是否初始展開,默認 false | Boolean | true |
| checked | 節(jié)點是否初始為選中狀態(tài)(如果開啟復選框的話),默認 false | Boolean | true |
| disabled | 節(jié)點是否為禁用狀態(tài)。默認 false | Boolean | false |
后臺請求數(shù)據(jù)的方法。
@RequestMapping(value = "/treeload")
@ResponseBody
public Object treeload(){
Sort sort = Sort.by("idx");
List<Dept> dpet = deptService.findByParentIsNull(sort); //查找所有菜單
List<HashMap<String, Object>> result = new ArrayList<>(); //定義一個map處理json鍵名問題
return fun(dpet, result);
}
private Object fun(List<Dept> dpet, List<HashMap<String, Object>> result) {
for(Dept d : dpet){
HashMap<String, Object> map = new HashMap<>();
map.put("id", d.getId());
map.put("title", d.getName());
map.put("spread", true); //設置是否展開
List<HashMap<String, Object>> result1 = new ArrayList<>();
List<Dept> children = d.getChildren(); //下級菜單
//這里可以根據(jù)自己需求判斷節(jié)點默認選中
/*if(m.getParent() != null || m.getChildren().size() == 0){
map.put("checked", true); //設置為選中狀態(tài)
}*/
map.put("children", fun(children, result1));
result.add(map);
}
return result;
}因為這里新建的實體類字段名和tree指定了json數(shù)據(jù)的鍵名稱不一樣,所以這里用了一個fun遞歸方法處理的。中間可以根據(jù)項目需求,根據(jù)條件判斷是否需要選中該節(jié)點。
返回的JSON數(shù)據(jù)格式

[
{
"children": [ //子節(jié)點
{
"children": [
{
"children": [],
"id": 30,
"title": "測試",
"spread": true
}, {
"children": [],
"id": 31,
"title": "開發(fā)",
"spread": true
}, {
"children": [
{
"children": [],
"id": 36,
"title": "測試節(jié)點",
"spread": true
}
],
"id": 32,
"title": "測試",
"spread": true
}
],
"id": 2,
"title": "技術(shù)部",
"spread": true
}, {
"children": [],
"id": 19,
"title": "財務部",
"spread": true
}
],
"id": 1, //節(jié)點id
"title": "某某公司", //節(jié)點名稱
"spread": true
}, {
"children": [],
"id": 33,
"title": "測試",
"spread": true
}
]設置節(jié)點點擊回調(diào)方法(在加載數(shù)據(jù)方法tree.render中添加以下代碼)。
click: function (obj) {
var id = obj.data.id;
$("#dept_home").load("dept/show?id="+id);
}把請求過來的詳情頁面load到右邊的div中顯示。后臺請求方法
@RequestMapping(value = "/show")
public void show(DeptForm form, ModelMap map) throws InstantiationException, IllegalAccessException {
Dept model = new Dept();
Integer id = form.getId();
Integer parentId = 0;
if(id!=null) {
model = deptService.findById(id);
parentId = model.getParent()==null?0:model.getParent().getId();
}
map.put("parentId", parentId);
map.put("model", model);
}DeptForm類為一個接收類,其中字段和實體類中一樣。根據(jù)請求傳遞過來的id,查詢這條數(shù)據(jù)的詳細信息,之后把查詢的當前部門詳情數(shù)據(jù)及父級節(jié)點id(用于下拉樹TreeSelect)傳遞給詳情頁面。
show.html詳情頁面代碼。
<meta charset="UTF-8" />
<style type="text/css">
.myData .layui-form-item{
margin: 20px 100px 10px 45px;
}
.myData .layui-form-label{
width: 85px;
}
.layui-input-block {
margin-left: 120px;
}
</style>
<form class="layui-form myData" action="save" method="post" lay-filter="stuform">
<input type="hidden" name="id" data-th-value="${model.id}" />
<div class="layui-form-item">
<label class="layui-form-label">上級部門:</label>
<div class="layui-input-block">
<input type="text" name="parentId" id="tree" lay-filter="tree" class="layui-input" />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">部門名稱:</label>
<div class="layui-input-block">
<input type="text" name="name" lay-verify="required" th:value="${model.name}" class="layui-input" />
</div>
</div>
<div class="layui-form-item" >
<label class="layui-form-label">部門負責人:</label>
<div class="layui-input-block">
<input type="text" name="deptName" th:value="${model.deptName}" class="layui-input" />
</div>
</div>
<div class="layui-form-item" >
<label class="layui-form-label">電話:</label>
<div class="layui-input-block">
<input type="text" name="phone" th:value="${model.phone}" class="layui-input" />
</div>
</div>
<div class="layui-form-item" >
<label class="layui-form-label">編號:</label>
<div class="layui-input-block">
<input type="text" name="number" th:value="${model.number}" class="layui-input" />
</div>
</div>
<div class="layui-form-item" >
<label class="layui-form-label">排序:</label>
<div class="layui-input-block">
<input type="text" name="idx" value="0" th:value="${model.idx}" class="layui-input" />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<button lay-submit class="layui-btn layui-btn-radius layui-btn-normal" lay-filter="btnSub">
<i class="layui-icon"></i>修改并保存
</button>
</div>
</div>
</form>
<script th:inline="javascript">
layui.use(["treeSelect", "form", "tree"], function () {
var form = layui.form;
var tree = layui.tree;
form.render('select');
var treeSelect = layui.treeSelect;
treeSelect.render({
// 選擇器
elem: '#tree',
// 數(shù)據(jù)
data: 'dept/treeSelect?id='+[[${model.id==null ? 0 : model.id}]],
// 異步加載方式:get/post,默認get
type: 'post',
// 占位符
placeholder: '上級菜單',
// 是否開啟搜索功能:true/false,默認false
search: true,
// 一些可定制的樣式
style: {
folder: {
enable: true
},
line: {
enable: true
}
},
// 加載完成后的回調(diào)函數(shù)
success: function (d) {
// 選中節(jié)點,根據(jù)id篩選
treeSelect.checkNode('tree', [[${model.parent == null? parentId: model.parent.id}]]);
treeSelect.refresh('tree');
}
});
form.on('submit(btnSub)', function (data) {
$.post('dept/save', data.field, function (result) {
if (result.success) {
tree.reload('treeId', {data: getData()});
}
layer.msg(result.msg, {offset: 'rb'});
});
return false;
});
});
</script>上級部門使用的是LayUI下拉樹顯示的,下拉樹數(shù)據(jù)請求方法。關(guān)于下拉樹的使用,可以訪問LayUI下拉樹TreeSelect的使用
@RequestMapping(value="/treeSelect")
@ResponseBody
public Object treeSelect(Integer id) {
Sort sort = Sort.by("idx");
Specification<Dept> spec = buildSpec1();
List<Dept> list = deptService.findAll(spec,sort);
return buildTree(list, id);
}
private Object buildTree(List<Dept> list, Integer id) {
List<HashMap<String, Object>> result=new ArrayList<>();
for (Dept dept : list) {
if(dept.getId() != id) {
HashMap<String, Object> node=new HashMap<>();
node.put("id", dept.getId());
node.put("name",dept.getName());
node.put("open", false);
node.put("checked", false);
if(dept.getChildren().size() != 0) {
node.put("children",buildTree(dept.getChildren(), id));
}
result.add(node);
}
}
return result;
}
public Specification<Dept> buildSpec1() {
Specification<Dept> specification = new Specification<Dept>() {
private static final long serialVersionUID = 1L;
@Override
public Predicate toPredicate(Root<Dept> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
HashSet<Predicate> rules=new HashSet<>();
Predicate parent = cb.isNull(root.get("parent"));
rules.add(parent);
return cb.and(rules.toArray(new Predicate[rules.size()]));
}
};
return specification;
}顯示的效果。

上面修改并保存后臺方法(因為修改和新增共用的一個方法,用id區(qū)分的)。
@Override
public Object save(DeptForm form) {
try {
Dept model = new Dept();
Integer id = form.getId();
if(id != null) {
model = deptService.findById(id);
}
//父級菜單id
Integer parentId = form.getParentId();
if(parentId == null) {
model.setParent(null);
}else {
model.setParent(new Dept(parentId));
}
BeanUtils.copyProperties(form, model,"id", "parent");
deptService.save(model);
return new AjaxResult("數(shù)據(jù)保存成功!");
} catch (Exception e) {
return new AjaxResult(false,"數(shù)據(jù)保存失敗");
}
}設置節(jié)點操作(在加載數(shù)據(jù)方法tree.render中添加以下代碼)。
edit: ['add', 'update', 'del'], //操作節(jié)點的圖標
operate: function(obj){
var type = obj.type; //得到操作類型:add、edit、del
var data = obj.data; //得到當前節(jié)點的數(shù)據(jù)
var elem = obj.elem; //得到當前節(jié)點元素
var id = data.id;
var name = data.title;
if(type === 'add'){ //增加節(jié)點
$.post("dept/save", {parentId: id, name: "未命名"}, function (result) {
tree.reload('treeId', {data: getData()});
})
//返回 key 值
return ;
} else if(type === 'update'){ //修改節(jié)點
$.post("dept/update", {id: id, name: name}, function () {
tree.reload('treeId', {data: getData()});
})
} else if(type === 'del'){ //刪除節(jié)點
$.post("dept/delete", {id: id}, function () {
tree.reload('treeId', {data: getData()});
});
};
}其中operate為操作節(jié)點回調(diào)方法。
obj.type為操作類型,add為新增,update為修改,edl為刪除。obj.data為操作節(jié)點后的數(shù)據(jù)。
新增節(jié)點后,向后臺發(fā)送請求添加節(jié)點,save方法和上面修改方法一樣,id為新建節(jié)點的父級節(jié)點id。
修改節(jié)點,同樣,向后臺發(fā)送修改請求,并傳遞對象的id,和修改后的數(shù)據(jù)作為參數(shù)。后臺響應方法。
@RequestMapping(value = "/update")
@ResponseBody
public Object update(DeptForm form) {
try {
Dept model = deptService.findById(form.getId());
model.setName(form.getName());
deptService.save(model);
return new AjaxResult("數(shù)據(jù)保存成功!");
} catch (Exception e) {
return new AjaxResult(false,"數(shù)據(jù)保存失敗");
}
}刪除節(jié)點同理,傳遞刪除節(jié)點的id。刪除請求方法。
@RequestMapping(value="/delete")
@ResponseBody
public Object delete(Integer id) {
try {
deptService.deleteById(id);
return new AjaxResult("數(shù)據(jù)刪除成功");
} catch (Exception e) {
return new AjaxResult(false,"數(shù)據(jù)刪除失敗");
}
}使用按鈕操作樹形菜單。
現(xiàn)在頁面中定義兩個按鈕,給按鈕添加lay-demo=""屬性,并設置屬性值,JS通過這個屬性值,綁定點擊事件。
<button class="layui-btn layui-btn-sm layui-btn-radius layui-btn-normal" lay-demo="addDept"><i class="layui-icon"></i>添加部門</button> <button class="layui-btn layui-btn-sm layui-btn-radius layui-btn-normal" lay-demo="gain">獲取選中節(jié)點</button>
綁定添加部門和獲取選中節(jié)點按鈕的點擊事件的JS代碼。
util.event('lay-demo', {
addDept: function(othis){
$.get('dept/edit', function(data) {
layer.open({
type: 1,
title: '新增',
area: ['530px'],
content: data,
btn: ['提交', '退出'],
yes: function () {
},
success: function (layero, index) {
layui.use('form', function () {
var form = layui.form;
layero.addClass('layui-form');
var submitBtn = layero.find('.layui-layer-btn0');
submitBtn.attr('lay-filter', 'formVerify').attr('lay-submit', '');
layero.keydown(function (e) {
if (e.keyCode == 13) {
submitBtn.click();
}
});
form.on('submit(formVerify)', function (data) {
$.post('dept/save', data.field, function (result) {
if (result.success) {
layer.close(index);
tree.reload('treeId', {data: getData()});
}
layer.msg(result.msg, {offset: 'rb'});
});
return false;
});
});
}
})
})
},
gain: function () {
var checkData = tree.getChecked('treeId');
var str = JSON.stringify(checkData);
$.post('dept/checkedGain', {data: str}, function () {
});
layer.alert(JSON.stringify(checkData), {shade:0});
}
});添加部門按鈕點擊事件,先發(fā)送請求到后臺,跳轉(zhuǎn)到eidt新增頁面,edit.html新增頁面代碼,和上面的show.html顯示部門詳情頁面差不多。上級部門同樣使用的LayUI下拉樹顯示的,下拉樹數(shù)據(jù)請求方法,和上面的詳情頁面下拉樹請求方法一致。LayUI下拉樹TreeSelect的使用。新增后的保存方法也和上面的保存方法一致。
后臺請求方法代碼,跳轉(zhuǎn)到edit頁面。
@RequestMapping(value = "/edit")
public void edit(){
}edit.html頁面完整代碼如下。
<meta charset="UTF-8" />
<style type="text/css">
.myData .layui-form-item{
margin: 20px 100px 10px 45px;
}
.myData .layui-form-label{
width: 85px;
}
.layui-input-block {
margin-left: 120px;
}
</style>
<form class="layui-form myData" action="save" method="post" lay-filter="stuform">
<div class="layui-form-item">
<label class="layui-form-label">上級部門:</label>
<div class="layui-input-block">
<input type="text" name="parentId" id="tree2" lay-filter="tree2" class="layui-input" />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">部門名稱:</label>
<div class="layui-input-block">
<input type="text" name="name" lay-verify="required" class="layui-input" />
</div>
</div>
<div class="layui-form-item" >
<label class="layui-form-label">部門負責人:</label>
<div class="layui-input-block">
<input type="text" name="deptName" class="layui-input" />
</div>
</div>
<div class="layui-form-item" >
<label class="layui-form-label">電話:</label>
<div class="layui-input-block">
<input type="text" name="phone" class="layui-input" />
</div>
</div>
<div class="layui-form-item" >
<label class="layui-form-label">編號:</label>
<div class="layui-input-block">
<input type="text" name="number" class="layui-input" />
</div>
</div>
<div class="layui-form-item" >
<label class="layui-form-label">排序:</label>
<div class="layui-input-block">
<input type="text" name="idx" value="0" class="layui-input" />
</div>
</div>
</form>
<script th:inline="javascript">
layui.use(["treeSelect", "form"], function () {
var form = layui.form;
form.render('select');
var treeSelect = layui.treeSelect;
treeSelect.render({
// 選擇器
elem: '#tree2',
// 數(shù)據(jù)
data: 'dept/treeSelect',
// 異步加載方式:get/post,默認get
type: 'post',
// 占位符
placeholder: '上級菜單',
// 是否開啟搜索功能:true/false,默認false
search: true,
// 一些可定制的樣式
style: {
folder: {
enable: true
},
line: {
enable: true
}
},
// 加載完成后的回調(diào)函數(shù)
success: function (d) {
}
});
});
</script>頁面效果。

獲取選中節(jié)點按鈕點擊事件。如果項目需要保存數(shù)據(jù)時,就需要獲取到選中節(jié)點的數(shù)據(jù)了。這里可以獲取到選中節(jié)點的數(shù)據(jù),之后當參數(shù)傳遞到后臺。傳遞到后臺是一個JSON數(shù)據(jù)的字符串,需要轉(zhuǎn)換一下,這里給推薦大家兩個很好用的JSON轉(zhuǎn)換工具net.sf.json.JSONObject和Alibaba Fastjson。這里用的是Alibaba Fastjson,需要引入以下依賴。
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency>
這里用于輸出,新建了一個和tree的json數(shù)據(jù)的鍵名稱一樣的工具類DeptTree,代碼如下。
import java.util.ArrayList;
import java.util.List;
public class DeptTree {
private Integer id;
private String title;
private boolean checked;
private boolean spread;
private List<DeptTree> children = new ArrayList<>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public List<DeptTree> getChildren() {
return children;
}
public void setChildren(List<DeptTree> children) {
this.children = children;
}
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
public boolean isSpread() {
return spread;
}
public void setSpread(boolean spread) {
this.spread = spread;
}
}后臺接收到傳遞過來的JSON數(shù)據(jù)字符串,轉(zhuǎn)換后輸出方法。
@RequestMapping(value = "/checkedGain")
@ResponseBody
public void checkedGain(String data){
List<DeptTree> array2 = JSONArray.parseArray(data, DeptTree.class);
treeData(array2);
}
//遞歸輸出選中數(shù)據(jù)
private void treeData(List<DeptTree> array2) {
for (DeptTree tree: array2){
System.out.println(tree.getTitle()+"==="+tree.getId());
if(tree.getChildren() != null){
treeData(tree.getChildren());
}
}
}選中節(jié)點,點擊獲取選中節(jié)點數(shù)據(jù)。

后臺對應方法接收到數(shù)據(jù),轉(zhuǎn)換后輸出結(jié)果。

數(shù)據(jù)拿到了,之后保存方法就簡單了。
后臺方法代碼基本都在上面了,頁面全部代碼。
<style type="text/css">
#dept_main, #dept_particulars{
width: 48.5%;
display: inline-block;
vertical-align: top;
padding: 20px;
background: white;
box-sizing: border-box;
}
#dept_tree{
margin-top: 20px;
}
</style>
<div id="dept_main" style="margin-right: 2%;">
<fieldset class="layui-elem-field layui-field-title">
<legend>所有部門</legend>
</fieldset>
<button class="layui-btn layui-btn-sm layui-btn-radius layui-btn-normal" lay-demo="addDept"><i class="layui-icon"></i>添加部門</button>
<button class="layui-btn layui-btn-sm layui-btn-radius layui-btn-normal" lay-demo="gain">獲取選中節(jié)點</button>
<div id="dept_tree">
</div>
</div>
<div id="dept_particulars">
<fieldset class="layui-elem-field layui-field-title">
<legend>部門詳情</legend>
</fieldset>
<div id="dept_home">
<div class="layui-tree-emptyText">無數(shù)據(jù)</div>
</div>
</div>
<script type="text/javascript">
layui.use(['tree', 'util', 'layer'], function() {
var tree = layui.tree;
var util = layui.util;
var layer = layui.layer;
tree.render({
elem: '#dept_tree',
data: getData(),
id: 'treeId',
showCheckbox: true, //時候顯示復選框
onlyIconControl: true,
edit: ['add', 'update', 'del'], //操作節(jié)點的圖標
click: function (obj) {
var id = obj.data.id;
$("#dept_home").load("dept/show?id="+id);
},
operate: function(obj){
var type = obj.type; //得到操作類型:add、edit、del
var data = obj.data; //得到當前節(jié)點的數(shù)據(jù)
var elem = obj.elem; //得到當前節(jié)點元素
var id = data.id;
var name = data.title;
if(type === 'add'){ //增加節(jié)點
$.post("dept/save", {parentId: id, name: "未命名"}, function (result) {
tree.reload('treeId', {data: getData()});
})
//返回 key 值
return ;
} else if(type === 'update'){ //修改節(jié)點
$.post("dept/update", {id: id, name: name}, function () {
tree.reload('treeId', {data: getData()});
})
} else if(type === 'del'){ //刪除節(jié)點
$.post("dept/delete", {id: id}, function () {
tree.reload('treeId', {data: getData()});
});
};
}
});
util.event('lay-demo', {
addDept: function(othis){
$.get('dept/edit', function(data) {
layer.open({
type: 1,
title: '新增',
area: ['530px'],
content: data,
btn: ['提交', '退出'],
yes: function () {
},
success: function (layero, index) {
layui.use('form', function () {
var form = layui.form;
layero.addClass('layui-form');
var submitBtn = layero.find('.layui-layer-btn0');
submitBtn.attr('lay-filter', 'formVerify').attr('lay-submit', '');
layero.keydown(function (e) {
if (e.keyCode == 13) {
submitBtn.click();
}
});
form.on('submit(formVerify)', function (data) {
$.post('dept/save', data.field, function (result) {
if (result.success) {
layer.close(index);
tree.reload('treeId', {data: getData()});
}
layer.msg(result.msg, {offset: 'rb'});
});
return false;
});
});
}
})
})
},
gain: function () {
var checkData = tree.getChecked('treeId');
var str = JSON.stringify(checkData);
$.post('dept/checkedGain', {data: str}, function () {
});
layer.alert(JSON.stringify(checkData), {shade:0});
}
});
});
function getData(){
var data = [];
$.ajax({
url: "dept/treeload", //后臺數(shù)據(jù)請求地址
type: "post",
async:false,
success: function(resut){
data = resut;
}
});
return data;
}
</script>以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
javascript 具名函數(shù)的四種調(diào)用方式 推薦
看四種方式執(zhí)行結(jié)果沒有區(qū)別。但如果函數(shù)有返回值的話,用new方式調(diào)用時可能會讓你有些失望。2009-07-07

