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.父子節點聯級勾選,網上有說用fireEvent( 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