var childCheck = function(node, checked) {
var a = node.attributes;
if (!a.leaf) {
var cs = node.childNodes;
var csui;
for (var i = 0; i < cs.length; i++) {
csui = cs[i].getUI();
csui.checkbox.checked = checked;
this.childCheck(cs[i], checked);
}
}
}
var parentCheck = function(node, checked) {
var checkbox = node.getUI().checkbox;
if (typeof checkbox == 'undefined')
return;
var state = childHasChecked(node, checked);
// if(!(checked ^ checkbox.checked))return;
// if(!checked && childhaschecked) return;
if (state == 0)// 全否
{
checkbox.checked = false;
checkbox.indeterminate = false;
} else if (state == 1) // 半选中
{
checkbox.checked = true;
checkbox.indeterminate = true;
} else {
checkbox.checked = true;
checkbox.indeterminate = false;
}
// checkbox.checked = checked;
node.attributes.checked = checkbox.checked;
node.getOwnerTree().fireEvent('check', node, checked);
var parentNode = node.parentNode;
if (parentNode !== null) {
parentCheck(parentNode, checked);
}
}
// 检查是否存在被勾选的 并且状态不为灰化的
var childHasChecked = function(node, checked) {
var childNodes = node.childNodes;
var retValue = 0;
if (childNodes || childNodes.length > 0) {
for (var i = 0; i < childNodes.length; i++) {
var checkbox = childNodes[i].getUI().checkbox;
// 本身是全选中状态 即 checked=true, indeterminate=false , 并且此次进来取消选中状态(参数checked=false)
// 则只需要找出子节点是否存在被选中如果存在某个子节点为半选中状态,则为半选中,否则不选中
if (!checked) {
if (checkbox.checked) // 存在选中 则直接退出
{
return 1;// 半选中状态
}
} else {
retValue = 2;
if (!checkbox.checked || (checkbox.checked && checkbox.indeterminate)) {
return 1;
}
}
}
}
return retValue;
}
tree.on('checkchange', function(node, checked) {
var parentNode = node.parentNode;
if (parentNode !== null) {
parentCheck(parentNode, checked);
}
node.expand();
node.attributes.checked = checked;
node.eachChild(function(child) {
child.ui.toggleCheck(checked);
child.attributes.checked = checked;
child.fireEvent('checkchange', child, checked);
});
}, tree);