软测单独项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

203 lines
6.1 KiB

//treeSelect组件
layui.define(['layer', 'ztree'], function(exports) {
var _MOD = 'treeselect',
layer = layui.layer,
$ = layui.jquery;
var TreeSelect = function() {
this.v = '1.0.0';
};
/**
* 渲染treeSelect
*/
TreeSelect.prototype.render = function(options) {
var that = this;
// 设置可参考ztree.js配置 URL:http://www.treejs.cn/v3/api.php
var setting = {
check: {
enable: true,
chkboxType: {
"Y": "",
"N": ""
}
},
view: {
dblClickExpand: false
},
data: {
simpleData: {
enable: true
}
},
callback: {
// ztree 点击前发生
beforeClick: function(treeId, treeNode) {
var zTree = $.fn.zTree.getZTreeObj(treeId);
zTree.checkNode(treeNode, !treeNode.checked, null, true);
},
// ztree 点击时发生
onClick: onClick,
onCheck: onClick
}
};
// 获取当前时间戳
var times = new Date().getTime();
var eId = 'content' + times;
var treeDOMId = 'treeDemo' + times;
// 创建DOM
$(options.elem)
.parent()
.append('<div class="ztree-input" id="' + options.elem.substr(1) + '"></div>')
.append(['<div id="' + eId + '" class="ztree-content layui-anim layui-anim-upbit">',
'<ul id="treeDemo' + times + '" class="ztree"></ul>',
'</div>'
].join(''))
.children('input.layui-input').removeAttr('id');
// 初始化zTree
var zTree = $.fn.zTree.init($('#' + treeDOMId), setting, options.data);
// 获取所有节点
var nodes = zTree.getNodes();
// 获取初始值
var vals = $(options.elem).parent().children('input.layui-input').val();
if ($.trim(vals).length > 0) {
initNode(nodes);
}
// 初始化数据
function initNode(nodes) {
for (var i = 0, l = nodes.length; i < l; i++) {
var node = nodes[i];
if (findArray(vals.split(','), node.id) !== -1) {
zTree.checkNode(node, true, false);
$(options.elem).append([
'<a href="javascript:;">',
node.name,
' <i class="layui-icon" data-action="close" data-tid="' + node.tId + '" data-id="' + node.id + '">&#x1006;</i>',
'</a>'
].join(''));
_bindCloseEvent();
}
if (node.children !== null && node.children !== undefined && node.children.length > 0) {
// 递归调用
initNode(node.children);
}
}
};
//点击事件的处理
function onClick(e, treeId, treeNode) {
var zTree = $.fn.zTree.getZTreeObj(treeId),
nodes = zTree.getCheckedNodes(true), //获取选中的节点
valIds = [],
arr = [];
for (var i = 0, l = nodes.length; i < l; i++) {
valIds.push(nodes[i].id);
arr.push({
name: nodes[i].name,
id: nodes[i].id,
tid: nodes[i].tId
});
}
_div = $(options.elem);
var _htm = [];
layui.each(arr, function(index, item) {
_htm.push([
'<a href="javascript:;">',
item.name,
' <i class="layui-icon" data-action="close" data-tid="' + item.tid + '" data-id="' + item.id + '">&#x1006;</i>',
'</a>'
].join(''));
});
_div.html(_htm.join(''));
//给input 赋值
var _input = _div.siblings('input.layui-input');
_input.attr("value", valIds.join(','));
_bindCloseEvent();
}
// input 框点击事件
$(options.elem).off('click').on('click', function() {
$("#" + eId).show();
$(document).off('mousedown').on("mousedown", function(event) {
if (!('#' + event.target.id == options.elem || event.target.id == eId || $(event.target).parents('#' + eId).length > 0)) {
// 隐藏ztree
$("#" + eId).fadeOut('fast');
}
});
});
/**
* 绑定删除按钮事件
*/
function _bindCloseEvent() {
var _div = $(options.elem),
_input = _div.siblings('input.layui-input');
_div.find('i[data-action=close]').off('click').on('click', function(e) {
layui.stope(e);
// 获取id
var id = $(this).data('id');
// 获取tid
var tid = $(this).data('tid');
// 处理节点显示
var node = zTree.getNodeByTId(tid);
// 将对应的ztree节点的check取消选中
zTree.checkNode(node, false, false);
// 处理input 值
var inputs = _input.val().split(',');
// 移除当前所选值Id
inputs.remove(id);
// 重新辅助
_input.attr('value', inputs.join(','));
// 移除截元素
$(this).parent().remove();
});
}
return that;
};
// Array 扩展
Array.prototype.indexOf = function(val) {
for (var i = 0; i < this.length; i++) {
if (this[i] == val) return i;
}
return -1;
};
// 移除指定值
Array.prototype.remove = function(val) {
var index = this.indexOf(val);
if (index > -1) {
this.splice(index, 1);
}
};
/**
*
* 查找数组,返回匹配到的第一个index
*
* @param array 被查找的数组
* @param feature 查找特征 或者为一个具体值,用于匹配数组遍历的值,或者为一个对象,表明所有希望被匹配的key-value
* @param or boolean 希望命中feature全部特征或者只需命中一个特征,默认true
*
* @return 数组下标 查找不到返回-1
*/
function findArray(array, feature, all) {
all = all || true;
for (var index in array) {
var cur = array[index];
if (feature instanceof Object) {
var allRight = true;
for (var key in feature) {
var value = feature[key];
if (cur[key] == value && !all) return index;
if (all && cur[key] != value) {
allRight = false;
break;
}
}
if (allRight) return index;
} else {
if (cur == feature) {
return index;
}
}
}
return -1;
};
// 导出组件
exports(_MOD, new TreeSelect());
});