需要实现的效果如图:
当然这是用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面板,满足条件后返回。