需要實現的效果如圖:
當然這是用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面板,滿足條件後返回。