做后台系统少不了组织架构的树状图,各种拖放,各种右键等等都是很正常的,下面我来谈谈自己在学习ext4.2遇到的几个问题。
1.拖放时叶子不能append如何解决?
答:这是Ext内部限制,只有在leaf:true的状态下才能添加子节点,so我们可以在拖动到该节点是修改其leaf为true,关键是触发事件是什么呢,通过API文档就可以发现view的beforedrop事件符合要求,代码如下:
this.control({
'department treeview[itemId=deptView]':{
beforedrop:this.changeLeaf
}}
changeLeaf: function(node, data, overModel, dropPosition, dropHandler) {
if(overModel.get('leaf')){
overModel.set('leaf',false);
overModel.set('loaded',true);
}
return true;
},
这里是controller里的写法,不懂百度就懂,或者tree.view.on("beforedrop",function(........)){....}
2.treepanel不能正常显示?
答:这里解释其中一种比较bug的原因,ext4.2版本中必须要设置treestore中的root才能正常显示,别问我问什么。
3.treepanel的getChecked()方法如何使用?
答:这里我们必须明确一件事情,getChecked()中返回选中的记录是指带有checkBox的treepanel被勾选的项,换句话说,不带有checkBox的tree,通过鼠标点击选中时,使用getChecked()是会返回null的,这个一定要分清。那么,下面问题来了
4.如何获取treepanel中鼠标单击选中的项呢,若还需要得到这一项的父节点呢?
答:前者很简单,由于treepanel也是panel,所以通过grid.getSelectionModel().selected.get(0)就可以得到行的record,难点在如何得到父节点,这里先说明一点,treepanel使用独有的nodeinterface,里面根据model的属性生成对应属性并保存value,不懂请百度。而我们上面获取的是model类型,是不存在父节点这一类说法的,所以我想了一个比较有趣的方法来获取,至于有更好的方法请留言(通过click,itemcontextmenu等事件参数自动代入不算),不多说,直接上代码:
var record=grid.getSelectionModel().selected.get(0);
var rNode=grid.getRootNode();
var cNode=rNode.findChild('id',record.data['id'],true);
var fatherNode=cNode.parentNode;
alert(fatherNode.data.name);
略略解释下,第二行为得到根节点,也就是root 啦,findChild方法的参数为属性名,属性值,是否找子节点的子节点,不懂请看API,一定要看。最后注意nodeinterface类型的读取属性是 .data.属性名
先写到这里,拖放的问题等遇到有价值的再补上,如有错误,也请留言指出,多多指教