extjs4.1實現tree節點checkbox disable的方法探討

       需要實現的效果如圖:

       當然這是用extjs3做出的效果,在3裏面直接node.ui.checkbox.disabled=true即可,如果設置節點就用node.disable();
       但是現在問題就是在extjs4.1裏面,就是找不到這個方法(反正我翻了很多遍api,就是沒找到,如果你找到了,請告訴我一聲,下面的方法可以直接路過了,嘿嘿、、、)。

       先說說思路,如果你用firefox看extjs3.x實現disable的dom變化就會發現這個東西:


       當某個組件設置disable後class就會多這個樣式,一查看該樣式你就明白了:

.x-masked {
    overflow: hidden !important;
}
}.ext-el-mask {
    background-color: #ccc;
}
.ext-el-mask {
    z-index: 100;
    position: absolute;
    top:0;
    left:0;
    -moz-opacity: 0.5;
    opacity: .50;
    filter: alpha(opacity=50);
    width: 100%;
    height: 100%;
    zoom: 1;
}
        關鍵是ext-el-mask這個樣式,並且上圖中藍色的那個div層就是讓組件變模糊的那個東西,好了,到這裏我的思路就是自己定義一個樣式,並且在方法裏面添加該樣式到組件上,這樣效果就有了,具體代碼如下,簡單的不得了,不過缺陷太多:

.Diy-mask {
    opacity: 0.5;
    z-index: 100;
}
//-------------------------------
function setNode(tree,node,value){
    var checkbox=getCheckbox(tree,node);
    checkbox.disabled=value;
    if(value==true)
        checkbox.className=checkbox.className.replace('Diy-mask','')+' Diy-mask';
    else
        checkbox.className=checkbox.className.replace('Diy-mask','');
}
function getCheckbox(tree,node){
    var td=tree.getView().getNode(node).firstChild.firstChild;
    var checkbox=td.getElementsByTagName('input')[0];
    return checkbox;
} 

    代碼我就不具體解釋了,應該都看得懂,用法就是:

setNode(tree,node,true) ---相當於---node.checkbox.disable();
setNode(tree,node,false) ---相當於---node.checkbox.enable();

      下面說說缺陷:

       1、不能獨立設置某節點,這裏需要的參數是tree,node,value,如果可以不要tree這個參數,那麼這個方法就可以寫到node的方法裏面了,直接調用node.disable()什麼的就得了,但是爲了能夠獲取checkbox,不得不用tree.getView().getNode(node),返回一個節點的html片段,好了,如果extjs4.1的api裏面給個方法比如node.getEl()什麼的也就阿彌陀佛了,問題就更簡單方便了。

       2、實現的最終效果如下:


       效果是不是沒extjs3.x的好,肯定了,因爲3.x的checkbox disable不是用這種方法實現的,它應該採用的是直接把那個√換成模糊的,並不是在整個checkbox上加一層半透明的div,我是這樣猜測的,具體沒去研究,不過按這個思路應該也是好解決的。

     記:記下此篇主要是在幾個論壇發了這個問題,希望有人解決了,可是等了大半時間,沒人有實質性的解決辦法,網上搜也搜不到類似的問題,無賴自己先實現個效果再說,呵呵、、、

 

2012-09-21更新:

        添加node方法如下:

Ext.apply(Ext.data.Model.prototype,{
	disabled:true,
	getNodeUI:function(treeid){
		var me=this;
		var checkbox;
		var nodeui;
		var tree=Ext.getCmp(treeid);
		if(tree){
			nodeui=tree.getView().getNode(me).firstChild.firstChild;
		}else{
			Ext.ComponentManager.all.each(function(key,value){
				var Type=value.getXType();
				if(Type=="treepanel"&&value.getView().getNode(me)){
					nodeui=value.getView().getNode(me).firstChild.firstChild;
				}
			});
		}
		checkbox=nodeui.getElementsByTagName('input')[0];
		return [nodeui,checkbox];
	},
	getCheckbox:function(treeid){
		var checkbox=this.getNodeUI(treeid)[1];
		return {
			disabled:checkbox.disabled,
			disable:function(){	
				checkbox.disabled=true;
				checkbox.className=checkbox.className.replace('Diy-mask','')+' Diy-mask';
			},
			enable:function(){
				checkbox.disabled=false;
				checkbox.className=checkbox.className.replace('Diy-mask','');
			}
		}
	},
	disable:function(treeid){
		this.disabled=true;
		var nodeui=this.getNodeUI(treeid)[0];	
		nodeui.className=nodeui.className.replace('Diy-mask','')+' Diy-mask';	
	},
	enable:function(treeid){
		this.disabled=false;
		var nodeui=this.getNodeUI(treeid)[0];	
		nodeui.className=nodeui.className.replace('Diy-mask','');
	}
});

使用方法:

node.disabled    //獲取節點狀態
node.disable()   //設置節點不可用
node.enable()    //設置節點可用
node.getCheckbox().disabled   //獲取節點checkbox狀態
node.getCheckbox().disable()  //設置節點checkbox不可用
node.getCheckbox().enable()   //設置節點checkbox可用

注意事項:

       使用node.disable(),node.enable(),node.getCheckbox()時,可以帶樹的ID參數,以方便快速獲取到該節點,也可不帶,此時將在全界面搜索該tree面板,滿足條件後返回。

作者:kunoy
申明:作者寫博是爲了總結經驗,和交流學習之用。
如需轉載,請儘量保留此申明,並在文章頁面明顯位置給出原文連接。謝謝!

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章