问题:使用jsTree对用户进行菜单赋权的功能。在对某一用户仅赋权一个菜单下的部分模块功能后,单击此用户将模块树展现出来并将有权限的模块结点(ajax获取)选中。
加载选中模块时节点时出现了问题即对某一父模块节点进行checked操作时会默认将下面的所有子模块节点选中,无论有没有被赋权。这样就将没有赋权的模块结点也选上了(即左图效果)。
很明显是不对的,我想要的是仅将被赋权的模块结点选中,若一个模块节点下的子模块节点未全部赋权则该模块节点呈现半选中的状态(即右图的效果)。
这是由于设置了父子级联的问题,但是父子级联的功能又不能去掉。
思索一番后找到一个比较笨的方法:先实现左图的效果,然后将已选中的结点和后台传来有权限的结点数据作对比,找出没权限的结点后做unchecked操作。
即在原来的基础上增加取消选中的操作。
$.ajax({
type: 'get',
url: "/Module/UserModuleJson",
data: { UserID: userID },
cache: false,
success: function (data) {
$("#moduleTree").jstree(true).uncheck_all();
$("#moduleTree").jstree('check_node', data);
//以下代码为在原来的基础上增加的取消结点选中操作
var ids = [];
$.each($("#moduleTree").jstree(true).get_checked(true), function (index, item) {
ids.push(item.id);
var IsCheck = false;
$.each(data, function (i, id) {
if (item.id == id) {
IsCheck = true;
}
});
if (IsCheck == false) {
$('#moduleTree').jstree('uncheck_node', item.id);
}
});
}
});
最后此方法在循环内套了循环加判断仅适合数据量不大的情况下。
若哪位大神有更好的方法请评论指点,或者我主动联系您!