extjs实现tree选中一个节点同时选中父节点和其子节点

dm520 2009-02-18 12:19:24
现在有多层节点的tree 要实现 选择一个节点 将其父节点选择且将其所有的子节点选择,


但其一的话我现在是实现了 但是就是放在一起同时实现不了 算法太难了 主要是嵌套


选中父节点:

tree.on('checkchange', function(node, flag) {
// 所有父节点选中
if (node.parentNode.id != 'root') {// 判断是不是root节点
if (flag || tree.getChecked(id, node.parentNode) == "") {// 如果该节点的父节点还有子节点被选者则父节点继续选择
node.parentNode.ui.toggleCheck(flag);
node.parentNode.attributes.checked = flag;
node.parentNode.fireEvent('checkchange', node.parentNode, flag);//递归调用
}
}
});

选中子节点:

tree.on('checkchange', function(node, flag) {
// 所有子节点选中
if (node.hasChildNodes()) {
node.eachChild(function(child) {
child.ui.toggleCheck(flag);
child.attributes.checked = flag;
child.fireEvent('checkchange', child, flag);//递归调用
});
}

});

...全文
4209 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
huigang_10086 2012-08-11
  • 打赏
  • 举报
回复

请大家给我看看是怎么回事,我不管那个‘+’号点开是否有选择项,就单独这个父节点的复选框打勾问题。
悠然的超能力 2010-09-02
  • 打赏
  • 举报
回复
// 全选父节点和子节点 @ 反选子节点
checkTree.on('checkchange', function(node, checked) {
selParent(node, checked);
selChild(node, checked);

});
// 全选父节点
function selParent(node, checked) {
if (checked) {
if (node.parentNode.id!="service_root_check_node") {// 判断是不是root节点
node.parentNode.ui.checkbox.checked = checked;
node.parentNode.attributes.checked = checked;
selParent(node.parentNode, checked);
}
}
}
// 全选或者反选子节点
function selChild(node, checked) {
node.eachChild(function(child) {
child.ui.checkbox.checked = checked;
child.attributes.checked = checked;
selChild(child, checked);
});

}
「已注销」 2010-05-24
  • 打赏
  • 举报
回复

//这个方法是选择父节点,自动选中所有的子节点
function a(node,checked){
checked?node.expand():node.collapse();
if(node.hasChildNodes()){
node.eachChild(function(child) {
child.attributes.checked = checked;
var cb = child.ui.checkbox;
if(cb) cb.checked = checked;
a(child,checked);
});
}
}
//这个方法是选择子节点,自动选中父节点的父节点
function b(node,checked){
if(checked){
node.expand();
var parentNode = node.parentNode;
if(parentNode!=undefined){
parentNode.attributes.checked = checked;
var cb = parentNode.ui.checkbox;
if(cb) cb.checked = checked;
b(parentNode,checked);
}
}
}
//这两个方法要在treepanel的checkchange里调用.


mvj1982 2010-05-05
  • 打赏
  • 举报
回复
想看看结果
lhy_287229489 2009-11-16
  • 打赏
  • 举报
回复
也需要答案,看不到得分的回复
hesling 2009-11-12
  • 打赏
  • 举报
回复
/** 取得一个节点的所有子节点 */
function getAllChildrenNodes(node){
var children = [];
if(!node.isLeaf()){//是目录
//node.expand();
for(var i=0;i<node.childNodes.length;i++){
children.push(node.childNodes[i]);
children = children.concat(getAllChildrenNodes(node.childNodes[i]));
}
}
return children;
}

/**子节点选中,其祖上节点亦选中*/
function checkAncestor(node, checked) {
//获取所有子节点
node.cascade(function(node){
node.expand();
node.attributes.checked = checked;
node.ui.checkbox.checked = checked;
return true;
});
//获取所有父节点
var pNode = node.parentNode;
while(pNode.id !="0"){//子节点选中,父节点也被选中
if (checked || node.getOwnerTree().getChecked(id,pNode)== "") {
pNode.ui.checkbox.checked = checked;
pNode.attributes.checked = checked;
}else{
var childNodes = getAllChildrenNodes(pNode);//获取被选中节点的所有子节点,若子节点还有被选中的,被选中的节点(即父节点)不勾掉
for (var i = 0; i < childNodes.length; i++) {
if (node.getOwnerTree().getChecked(id,childNodes[i])!= "") {
pNode.ui.checkbox.checked = checked;
pNode.attributes.checked = checked;
}
}
}
pNode = pNode.parentNode;
}
/*for(; pNode.id !="perRoot"; pNode = pNode.parentNode ){

}*/
}
xwzyp 2009-07-20
  • 打赏
  • 举报
回复

//使该节点路径上的父节点与该节点一致
personTree.on('checkchange', function(node, checked) {
node.attributes.checked = checked;
//使到该节点的路径上的节点均为选中状态
if(checked){
//判断不是root节点
if (node.parentNode.id != 'perRoot') {
//若父节点没有选中,则继续向上选中父节点
if(!node.parentNode.checked){
node.parentNode.ui.toggleCheck(checked);
node.parentNode.attributes.checked = checked;
//递归调用
node.parentNode.fireEvent('checkchange', node.parentNode, checked);
}
}else{
node.parentNode.ui.toggleCheck(checked);
node.parentNode.attributes.checked = checked;
}
}else{
if (node.parentNode.id != 'perRoot') {
//如果父节点没有被选中的子节点,则设为非选中状态
if(!node.parentNode.findChild('checked',true)){
node.parentNode.ui.toggleCheck(checked);
node.parentNode.attributes.checked = checked;
//递归调用
node.parentNode.fireEvent('checkchange', node.parentNode,checked);
}
}else{
if(!node.parentNode.findChild('checked',true)){
node.parentNode.ui.toggleCheck(checked);
node.parentNode.attributes.checked = checked; }
}
}
});
xwzyp 2009-07-20
  • 打赏
  • 举报
回复
还是分开实现的呀,没有满足楼主的要求,我也遇到了这个问题...
  • 打赏
  • 举报
回复
tree.on('checkchange', function(node, flag) {   
// 所有父节点选中
// Ext.log(node+"======"+node.parentNode);
// j=node;
if (node.parentNode.id != 'root') {// 判断是不是root节点
if (flag || tree.getChecked(id, node.parentNode) == "") {// 如果该节点的父节点还有子节点被选者则父节点继续选择
node.parentNode.ui.toggleCheck(flag);
node.parentNode.attributes.checked = flag;
node.parentNode.fireEvent('checkchange', node.parentNode, flag);//递归调用
}
}
});
dm520 2009-02-18
  • 打赏
  • 举报
回复
楼上的只是选择了子节点 并没有同时选择父节点,我所想要的是任意一个节点 只要其有父节点和子节点 全选中
  • 打赏
  • 举报
回复
tree.on('checkchange', function(node, 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);

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧