日期:2014-05-16  浏览次数:20347 次

Extjs:初始化树结点为被选择状态(checked= true)的两种方法

有时,在修改功能中,会显示出树,并把其中某些结点初始化为已经选择的状态,即checked=true状态。

以前做了一种方法,但有些局限性,有时加载过慢的话就会出问题。现在把两种方法总结一下,贴出来。


方法一:在form的onload方法中,调用initSelectedNodes方法。

function initSelectedNodes(){
var rootN=Ext.getCmp('showparkingtree').getRootNode();//得到根结点
var szParkingIds = document.getElementById("parkingIds").value;   //拿到需要置为check=true状态的树结点
checkSelectedNodes(rootN,szParkingIds); //拿到要置为已经选择状态的id,然后初始化
 }


//递归查询应该被初始化为选择状态的停车场

function checkSelectedNodes(node,szParkingIds){
var childnodes = node.childNodes;
var szParkingId = szParkingIds.split(",");
        //对每一个子结点的操作
        for(var i=0; i < childnodes.length; i++){
var cNode = childnodes[i];   //对结点下每一个结点进行判断 
var checkedNodeId = "";
var flag = false; //用于判断该结点是否为选中的状态
for(var j=0;j<szParkingId.length;j++){
checkedNodeId = "regionInfo_" + szParkingId[j];
       //alert("cNode.id=" + cNode.id + " --- checkNodeId=" + checkedNodeId);
    if(cNode.id == checkedNodeId){
    flag = true;
    break;
    }
}    
 if(flag == true){ //是被选中
       cNode.ui.toggleCheck(true);
       cNode.attributes.checked = true;
   }
       
  if(cNode.childNodes.length >0){        
  checkSelectedNodes(cNode,szParkingIds);//递归调用
    }

 }//for end

}


但上面这个方法有个弊端,就是有可能ext树加载过慢,这样,这个方法可以被先执行到,从而导致树应该被置为选中的结点并没有被选中的状态。

但上面这个方法学习一下递归还是有好处的。比较喜欢第二种方法,很简单:

unitTree = new Ext.tree.TreePanel({
id:"showparkingtree",
firstChangeFlag:true,
//useArrows : true,
animate : false,
enableDD : false,
rootVisible : false,
border : false,
//bodyStyle : 'background-color:transparent;',
frame : false,
root : rootnode,