extjs4 tree 父子節點聯級勾選,半選節點半透明處理


1.extjs3有節點半選,有node.getUI()

1 node.getUI().toggleCheck(parentChk);//節點選中狀態
2 node.getUI().checkbox.indeterminate = true; //半選中狀態
3 node.getUI().checkbox.indeterminate = false;取消半選中狀態

 

extjs4中沒有。因此對於節點的子節點未全部選中,復選框須做區別顯示的問題,常規API中找不到對應方式方法。參考CSDN上處理節點disable的顯示處理方法,做類似處理。

參考鏈接:http://blog.csdn.net/kunoy/article/details/7930045

2.父子節點聯級勾選,網上有說用String eventName, Object... args )遞歸觸發事件,反正我這么處理是沒有效果,做不到所有父子節點都聯級,變通一下用遞歸方法處理也可以解決此問題。

思路:直接改js生成頁面css。因為extjs在節點收縮展開時都有對節點css做更改,所以在收縮時,展開后都要處理一下節點及其子節點的樣式(此方式效果不理想,有延遲的跡象)。

后記:重定義源碼來解決顯示問題,只需要修改Ext.tree.Column中的treeRenderer函數即可,能完美解決半選中的顯示問題。

原思路代碼展示:

  1 //我這里用的是treeStore,其實直接用treePanel也是一樣的
  2 treeStore.on('itemcollapse', function (node,opt) {setNode(treeStore,node,node.isHalfSelected)}, treeStore);
  3 treeStore.on('afteritemexpand', function (node,opt) {setNode(treeStore,node,node.isHalfSelected);setChildStyle(treeStore,node)}, treeStore);
  4 treeStore.on('checkchange', function (node, checked, opt) {treeStoreSelectedSon(node,checked);treeStoreSelectedFather(node,checked);}, treeStore);
  5     //遞歸選子節點    
  6     var treeStoreSelectedSon = function(node,checked) 
  7     {              
  8            //node.expand();
  9            node.isHalfSelected = false;
 10            node.eachChild(function(child) {         //循環下一級的所有子節點 
 11                   if (null != child.get('checked')) //這里這么寫是因為后台有些節點的checked沒賦值,其在web上不顯示復選框,這里就過濾掉對它們
 12                   {
 13                         child.set('checked', checked);       //選中 
 14                         treeStoreSelectedSon(child,checked);          //遞歸選中子節點
 15                   }                                       
 16            });  
 17     }   
 18     
 19     //遞歸選父節點    
 20     var treeStoreSelectedFather = function(node,checked) 
 21     {
 22         var parent = node.parentNode;   //獲取父節點 
 23         var flag = false;           
 24         var hasUnCheckedChild = false;
 25         var isHalfSelected = false;
 26         if (null != parent) {                 //是否有子節點            
 27           parent.eachChild(function(child) {         //循環下一級的所有子節點 
 28                     
 29                   if (child.get('checked') == true)
 30                   {
 31                         flag = true;
 32                         if (child.isHalfSelected)
 33                         {
 34                               isHalfSelected = true;
 35                         }
 36                   } 
 37                   else if (child.get('checked') == false)
 38                   {
 39                         hasUnCheckedChild = true;
 40                   }
 41            });
 42 
 43              parent.set('checked', flag);
 44              if ((flag && hasUnCheckedChild) || isHalfSelected)
 45              {
 46                    parent.isHalfSelected = true;
 47                    setNode(codeChangeTree,parent,true);
 48              }
 49              else
 50              {
 51                    parent.isHalfSelected = false;
 52                    setNode(codeChangeTree,parent,false);
 53              }
 54              treeStoreSelectedFather (parent,flag);
 55                        
 56         } 
 57     } 
 58 
 59 function setNode(tree,node,value){
 60         var checkbox=getCheckbox(tree,node);
 61         //checkbox.disabled=value;
 62         //半選中狀態
 63         if (node.isHalfSelected != null)
 64         {
 65             if(value==true)
 66             {
 67                 checkbox.className=checkbox.className.replace('Diy-mask','')+' Diy-mask';
 68             }
 69             //取消半選中
 70             else
 71             {
 72                 checkbox.className=checkbox.className.replace('Diy-mask','');
 73             }
 74         }        
 75     }
 76     
 77     function getCheckbox(tree,node){
 78         var td=tree.getView().getNode(node).firstChild.firstChild;
 79         var checkbox=td.getElementsByTagName('input')[0];
 80         return checkbox;
 81  82     
 83     function setChildStyle(tree,node) 
 84     {          
 85         if (node.isExpanded())
 86         {
 87             node.eachChild(function(child) {         //循環下一級的所有子節點                      
 88                   if (child.isHalfSelected != null)
 89                   {
 90                         var checkbox=getCheckbox(tree,child);
 91                          //半選中狀態
 92                       if(child.isHalfSelected == true)
 93                       {                     
 94                            checkbox.className=checkbox.className.replace(' Diy-mask','')+' Diy-mask';
 95                       }
 96                         //取消半選中
 97                       else
 98                       {
 99                           checkbox.className=checkbox.className.replace(' Diy-mask','');
100                       }              
101                       setChildStyle(tree,child);
102                   }                     
103             });
104         }           
105     }

css

1 .Diy-mask {
2     opacity: 0.5;                   //chrome
3     z-index: 100;
4     filter:alpha(opacity=50);  //IE必須加這句
5    -moz-opacity: 0.5;             //火狐    
6 }

----------------------------------------------------------華麗分割線,以下是一些extjs零碎-------------------------------------------------------------------------

另附更換樹葉子節點圖標的css,直接放到css中即可,但是css要放到extjs css之后引入,目的是覆蓋extjs css中的樣式。

.x-tree-icon-leaf{
 background-image:url(../images/test.png);
}

更換進度條樣式,對進度條的字體加粗,居中顯示

.x-progress-text {
  overflow: hidden;
  position: absolute;
  padding: 0 5px;
  height: 14px;
  font-weight: bold;
  font-size: 12px;
  line-height: 12px;
  text-align: center; 
}

樹節點被選中后的樣式,節點被選中后文字呈藍色

.x-tree-checked{
text-decoration:none !important;;
color:blue !important;
}

標簽水平垂直居中樣式

.lableCentre{
    line-height:20px;
    vertical-align:middle;
    font-weight:bold;
}
//引用
{
  xtype: 'label',
  id : 'testLabel',
  text : '',
  cls : 'lableCentre'
}

請求大量數據時,param中參數過長,用get請求瀏覽器會報錯,需要post請求

 proxy: {
        type: 'ajax',
        url: basePath + 'TestSelect?parameter=getTestList',
        actionMethods: { read: 'POST' },//post設置
        reader: {
            type: 'json',            
            idProperty: 'name'
        }
    },

樹中文本可以被選中用於復制粘貼

viewConfig:{   
           enableTextSelection:true  
},

--OVER

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM