extjs异步刷新父节点,只展开勾选中做操作的子节点(不是全部勾选子节点)
父节点下面有好几个子节点,有时候选中子节点做操作(例如计算价格),我们希望做完操作后刷新然后子节点选中。
原先的做法是通过做操作的子节点找到上一级对应的父节点,然后让父节点选中那么子节点也就会选中了。这么做有个不好的地方,业务需求:我们只希望那个子节点做完操作刷新之后展开并只勾选做操作的子节点,其余未做操作的不勾选。
思路:这样做怎么办呢我们只有把做操作前勾选的记录id放到数组中,在做完操作后勾选父节点那个对应的方法加一个判断,当此父节点下所有子节点id与之前放入数组中的id相等时才勾选,做完操作后记得 清空数组!
// 局部刷新上层节点的方法 zhangli 2012-7-9
refreshParentNode : function(selectNodes){
var selectNodeIds =selectNodes;
var importNodes = new Array();//new 一个数组 by hly 2013-10-14
if(selectNodes.length==undefined){//做右键做修改价格的时候直接把node对应id放到数组中by hly 2013-10-21
importNodes.push(selectNodes.attributes.id);//把选中的id 存入数组importNodes中by hly 2013-10-14
}else{
for(var i = 0 ; i < selectNodeIds.length; i++){
importNodes.push(selectNodeIds[i].id);//把选中的id 存入数组importNodes中by hly 2013-10-14
}
}
this.arrayN=importNodes;//把数组importNodes的值传递给全局变量数组arrayN by hly 2013-10-14
// 需要刷新的产品节点的集合
var toRefreshNodes = new Array();
// 将最后一层货票节点的父节点找出,把不重复的产品节点存入toRefreshNodes集合
Ext.each(selectNodes,function(node){
if(node.isLeaf()){
var parentNode = node.parentNode;
if(toRefreshNodes.length>0){
var equal = false;
Ext.each(toRefreshNodes,function(n){
// 判断产品节点在集合中是否已经存在
if(parentNode.attributes.id == n.attributes.id){
equal = true;
}
});
if(!equal){
toRefreshNodes.push(parentNode);
}
}else{
toRefreshNodes.push(parentNode);
}
}
});
var loader = this.loader;
// 刷新产品节点
Ext.each(toRefreshNodes,function(n){
loader.load(n,function(){
n.expand();
n.getUI().toggleCheck(false);
});
});
},
-------------------------------------------------------
// 复选框勾选事件 zhangli 2012-7-11
checkchange : function(node,checked){
var loader = this.loader;
if(checked && !node.isExpanded()){ // 当前是选中操作,并且节点没有展开,需要手动加载子节点数据,便于选中子节点
if(!node.isLeaf()){
loader.load(node,function(){
node.expand();
});
}
setTimeout(function(){
node.eachChild(function(n){
n.getUI().toggleCheck(true);
});
}, 800);
}else if(checked && node.isExpanded()){//为了计算合同价之后,选中父节点展开之后只选中原来进行计算价格合同的子记录by hly 2013-10-14
if(this.arrayN.length!=0){//判断放入数组的长度是否为零by hly 2013-10-14
Ext.each(this.arrayN,function(arrayNodeId){//arrayNodeId是放入数组里的id by hly 2013-10-15
node.eachChild(function(n){
if(arrayNodeId==n.id){//n.id是父节点下所有子节点(叶子节点,最后一层)id by hly 2013-10-15
n.getUI().toggleCheck(true);
}
});
});
this.arrayN=[];//子节点选中之后清空数组 by hly 2013-10-14
}else{
node.eachChild(function(n){
n.getUI().toggleCheck(true);
});
}
}else {
node.eachChild(function(n){
n.getUI().toggleCheck(false);
});
}
},