最近在写带复选框的Ext.tree.TreePanel的过程中,中到了一问题.
由于 Ext.tree.TreePanel复选框的响应事件为:'checkChange',改变节点是否被选中的方法为toggleCheck().
在对于选中子节点,其所有父节点也应该被选中,选中某一父结点,其所有子节点也应该被选中的需求时,就会遇到一点点小冲突.
"选中子节点,其所有父节点也应该被选中"
选中事件发生在子节点,但要通过toggleCheck()改变其父节点未被选中的状态,而一旦改变了父节点未被选中状态为选中状态,它就与第二条"选中某一父结点,其所有子节点也应该被选中"相冲突,因为我们只是选中了其中一个子节点,并不希望所有父节点的子节点都被选中.麻烦.
查看ext文档,可以找到两个方法:
suspendEvents() : void
Suspend the firing of all events. (see
resumeEvents)
Suspend the firing of all events. (see
resumeEvents)
Parameters:
- None.
void
意思就是暂停所有监听事件的执行.
还有另外一个方法:
resumeEvents() : void
Resume firing events. (see
suspendEvents)
Resume firing events. (see
suspendEvents)
Parameters:
- None.
void
意思就是说重新开始所有监听事件的执行,这么一来,就有了控制响应事件是否执行的途径了,对原来的代码进行修改
变为:
/**
* 当点击子节点时 将父节点选中
*/
checkedParentNodesWhenCheckChild : function(node) {
var tree=node.getOwnerTree();
tree.suspendEvents();
var allParentNodes = FaceYe.Tree.getAllParents(node);
if (allParentNodes.length > 1) {
for ( var i = 0; i < allParentNodes.length; i++) {
if (allParentNodes[i].id != node.id) {
if (!allParentNodes[i].getUI().isChecked()) {
allParentNodes[i].getUI().toggleCheck();
}
}
}
}
tree.resumeEvents();
}
这样,再做节点选中操作时,不管是子节点,还是父节点,还是根节点,不会再有问题.