Ext带复选框的Tree实现父子节点联动功能
来源:互联网 发布:上淘宝 编辑:程序博客网 时间:2024/05/18 07:59
昨晚有一个朋友问我EXT中带复选框的Tree控件是否可以实现节点被选中时父子节点联动的功能,之前做树形控件,一直都是在用Z-Tree的,速度快,功能强,这样的功能需求对于Z-Tree来说,完全小意思,原生API就可以支持的,偏偏到了EXT这里,就不行了。Ext本身是可以通过在节点属性中增加checked属性将一个普通节点变成带复选框的节点,但是奇怪的是,不支持父子节点联动功能,好怪异。
我觉得这个功能蛮简单的,刚好今天下午也有空,就自己写了一个demo,通过监听节点的checkchange事件来实现该功能,思路如下:
- 如果当前节点为父节点,则将当前节点的选中状态同步到所有的子节点;
- 如果当前节点被选中,则递归选中所有的祖先节点;
- 代码如下:
Ext.require([ 'Ext.tree.*', 'Ext.data.*', 'Ext.window.MessageBox']);Ext.onReady(function() { //树数据存储器 var store = Ext.create('Ext.data.TreeStore', { proxy: { //通过ajax代理获取数据 type: 'ajax', url: 'check-nodes.json' }, //排序器,可以没有 sorters: [{ property: 'leaf', direction: 'ASC' }, { property: 'text', direction: 'ASC' }] }); var tree = Ext.create('Ext.tree.Panel', { //指定数据源 store: store, //是否显示根节点 rootVisible: false, //是否箭头图标 useArrows: true, //是否以框架显示 frame: true, //标题 title: '多级节点联动树演示', //树结构的容器ID renderTo: 'tree-div', //树面板宽度 width: 200, //树面板高度 height: 250, //事件监听器 listeners: { //监听复选框的选中属性改变事件 checkchange : function(node,checked){ //获得父节点 pNode = node.parentNode; //改变当前节点的选中状态 node.checked = checked; //判断当前节点是否为叶子节点 var isLeaf = node.isLeaf(); //当该节点有子节点时,将所有子节点的选中状态同化 if (!isLeaf){ //cascade是指从当前节点node开始逐层下报,即遍历当前节点的每一个节点(无论有多少层级结构,详参API) node.cascade(function(node){ node.set("checked", checked); }); } //如果当前节点是选中状态 if (checked == true) { //将当前节点的所有未选中的父节点选中 for (;pNode != null && !pNode.get("checked");pNode = pNode.parentNode) { pNode.set("checked", true); } }else{ //取消当前节点的所有不包含选中的子节点的父节点的选中状态 for (;pNode != null;pNode = pNode.parentNode) { //如果当前的父节点包含选中的子节点,则终止搜索过程 if(hasCheckedNode(pNode)){ break; }else{ //否则取消当前父节点的选中状态 pNode.set("checked", false); } } } } } }); //检查指定的父节点是否包含有选中的子节点 function hasCheckedNode(node){ var has = false; //当前节点是否含有子节点 if(node.childNodes){ //遍历子节点 Ext.each(node.childNodes, function(item){ //如果当前节点是叶子节点 if(item.isLeaf()){ //遇到选中的子节点时终止搜索过程 if(has = item.get("checked")){ return false; } //遇到含有选中的子节点的父节点时终止搜索过程 }else if(has = hasCheckedNode(item)){ return false; } }); } return has; }});
0 0
- Ext带复选框的Tree实现父子节点联动功能
- 带复选框的Ext.tree.TreePanel的问题
- 实现TreeView父子节点的联动
- 带checkbox的treeview父子节点的联动选择
- TreeList实现父子节点联动
- 【无事水一发】ExtJS4 Ext.tree.Panel (无限层级)带复选框树勾选(父级子级)联动代码
- 在CTreeCtrl中捕获复选框选中消息,父子节点选中状态联动
- 在CTreeCtrl中捕获复选框选中消息,父子节点选中状态联动 .
- 在CTreeCtrl中捕获复选框选中消息,父子节点选中状态联动
- Ext.net TreePanel 父子节点联动。。。好费劲
- Ext.tree.TreePanel 对复选框的处理(Tree)
- treeview 父子节点联动
- Ext 带复选框的多选下拉框 MultiSelectComboBox
- Faceye ext中树结构带复选框的处理
- jquery实现复选框联动
- Java中带复选框的树(Java CheckBox Tree)的实现和应用
- Java中带复选框的树(Java CheckBox Tree)的实现和应用
- Java中带复选框的树(Java CheckBox Tree)的实现和应用
- php 内的静态变量及静态方法
- Docker实战(二):容器使用和镜像制作
- 深入理解Android中的Context
- JMeter学习(十四)JMeter监控Tomcat性能
- pure-ftpd开启日志功能
- Ext带复选框的Tree实现父子节点联动功能
- 浅谈zip格式处理逻辑漏洞
- 四种类型的引用
- Android Studio 程序暂停一段时间 与 新建一个子线程
- 静态导入:
- “支持向量机系列”的番外篇一: Duality
- 贪心+优先队列
- Java值传递和引用传递
- cocos2d 动画