閱讀483 返回首頁    go 阿裏雲 go 技術社區[雲棲]


[老貼重發]EXT:指定樹控件TreePanel 展開到第幾層

12年寫的文章了,可能由於某博客某年帳號泄露,被人刪除了很多文章。

還有底搞的,我就重發一下。


對於Ext.tree.TreePanel,相信使用過EXT的人一般都用到過。所以本文中不會包含EXT或TreePanel 基礎知識的介紹了

     比如做一個行政區劃的樹。如下圖所示:

5de989c160d0630dce2e3fd767a8be829a8aa55e

但在有的時候,這顆樹的數據量會很大,層級也會很深,默認全部展開的話,會很慢,而且顯示一大堆東西出來,顯示不符合用戶的需求。可又不是默認全部折疊,這樣用戶又第一眼看不見想關心的東西的內容。

    所以筆者在這裏提出了一個解決方案:展開到指定層級

    如上圖所示,在筆者剛剛完成的一個項目中,用戶隻需要關心鄉鎮的信息,偶爾會查看一下鄉鎮下麵的村組信息。所以在這次應用中,需要默認把樹展開到鄉鎮一級。

    要達到以上目的呢,目前有兩種手段:

      1)通過異步得到的節點數據信息中,將需要展開的節點加屬性定義:expanded:true

           如一個json格式的節點: {id:"XXXX",text:"YYYY",expanded:true}

           這種方式需要編寫異步取數據代碼時,根據你要展開到的層級,計算哪些節點需要做設置:expanded:true

      2)利用Treepanel的load事件,定義其響應函數,在響應函數中添加控製邏輯。

 

     因為第一種方式,太過繁瑣,不適合封裝成項目級的控件,所以本文將重點介紹第二種方式。

    先來曬曬load事件的響應函數中的部分代碼:[load事件:在節點加載後觸發。Fires when a node is loaded]

    在下麵的代碼中,除了實現了可以展開到指定層數,還可以隻展開第一個節點及該節點之下的各層子節點


var level=2;//通過這裏指定展開到第幾層  
         
       if(level==0)//此時規定:隻展開第一個節點及其所有子節點  
{    
       Ext.each(node.childNodes, function(n){     
        if(n.isFirst())  
        {  
        if(!n.isLeaf())          
        {  
               if(!n.isLoaded())  
               {          
                                                     
              n.reload();  
           }  
        }  
                      
         }  
                
     });  
                
}  
       if(level>0)//此時規定:根據設置的層數,展開到第level層  
       {  
        var path=node.getPath();  
        var index=path.indexOf('/');  
        var loadedlevel=0;  
        while(index>=0)   
        {  
            loadedlevel++;  
            index=path.indexOf('/',index+1);          
        }  
        if(loadedlevel<level)  
        {  
            Ext.each(node.childNodes, function(n){    
                                
              if(!n.isLeaf()) //zhangpf 當n.isLeaf()=true時,n為Ext.tree.TreeNode類型,不具有isLoaded()和reload()方法         
          {  
                if(!n.isLoaded())  
                {         
                                                 
                    n.reload();  
                }  
              }  
           });  
                
        }  
       }  

 代碼不難,這裏就不多做詳解。這裏隻說一點:關於isLoaded()和reload()方法,它們不是TreeNode的方法,而是屬於AsyncTreeNode的方法。所以在用它們時,要格外小心。

     OK,再曬下完整點的代碼,它是我封裝的struts的頁麵控件,最終生成的部分js。我又拿來修改些,去掉了些,所以不保證一定能運行起來。

 

    這裏補充一句:這裏的展開到指定層的邏輯,同樣適用於Ext改寫的ComboboxTree


 Ext.onReady(function(){  
   var tree = new Ext.ux.ComboBoxTree({  
        id:'XXXX',  
        renderTo : 'XXX_div',  
        hiddenName:"XXX_name",  
        name: 'folderMoveTo',  
        displayField: 'text',  
                valueField: 'id',  
        width : 200,  
        typeAhead: true,   
            triggerAction: 'all',  
            autoScroll : false,    
            selectOnFocus: true,  
                       forceSelection: true,  
        tree : {  
            xtype:'treepanel',  
            listeners:{beforeload:loadTree,load:afterload},               
             rootVisible: true,  
             autoScroll : false,     
                autoHeight : true,    
             root : new Ext.tree.AsyncTreeNode({id:'-1',text:'-請選擇-'})  
        },  
                      
        selectNodeModel:'all'  
    });  
      
    tree.setValue({id:'',text:'-請選擇-'});  
});  
      
      
function loadTree(node){  
    if (node.id == "-1") {         
            tree.tree.loader.dataUrl =  'https://127.0.0.1:9900/gmitp/platform/system/listAllArea.action?parentNodeId=-1';  
    } else  {         
        tree.tree.loader.dataUrl = 'https://127.0.0.1:9900/gmitp/platform/system/listAllArea.action?parentNodeId='+node.id;  
    }  
  
}     
  
  
function afterload(node){  
  
    //實現設置展開層數.  
       var level=3;  
         
       if(level==0)//此時規定:隻展開第一個節點及其所有子節點  
        {    
            Ext.each(node.childNodes, function(n){    
                if(n.isFirst())  
                {  
                    if(!n.isLeaf())          
                    {  
                        if(!n.isLoaded())  
                        {         
                                                     
                            n.reload();  
                        }  
                    }  
                    return;  
                }  
                
             });  
                
     }  
       if(level>0)//此時規定:根據設置的層數,展開到第level層  
       {  
        var path=node.getPath();  
        var index=path.indexOf('/');  
        var loadedlevel=0;  
        while(index>=0)   
        {  
            loadedlevel++;  
            index=path.indexOf('/',index+1);          
        }  
        if(loadedlevel<level)  
        {  
            Ext.each(node.childNodes, function(n){    
                                
                if(!n.isLeaf()) //zhangpf 當n.isLeaf()=true時,n為Ext.tree.TreeNode類型,不具有isLoaded()和reload()方法         
                {  
                    if(!n.isLoaded())  
                    {         
                                                 
                        n.reload();  
                    }  
                }  
             });  
                
        }  
       }  
}  



最後更新:2017-11-09 16:33:37

  上一篇:go  實現水下精準測量:三星智能手環全新防水壓力傳感器
  下一篇:go  包你拚係統開發