ExtJS Tree点击选择节点,不展开/展开(三)
实例讲解:点击触发域(Ext.form.TriggerField)三角按钮,弹出树面板窗口,并将触发域中的内容在树面板中选中,并展开选中节点的父目录。
一.选中节点,不展开:
1.创建Tree:
//1.定义根节点:主管部门 var departRoot = new Ext.tree.AsyncTreeNode({ text:"主管部门", draggable:false, expanded:true, //节点展开 id:'depart-root' }); //2.定义子节点数据加载器 var dloader = new Ext.tree.TreeLoader({ dataUrl:'getTree.base?doType=getDTreeByGrade&dtype=0', baseParams :{pid:''}, baseAttrs: { uiProvider: Ext.tree.TreeCheckNodeUI } //添加 uiProvider 属性 }); //3.获取主管部门子节点数据 dloader.on("beforeload",function(treeLoader, node){ treeLoader.baseParams.pid = node.id; },this); //4.定义树面板,显示节点数据 var departTree = new Ext.tree.TreePanel({ id:'departTree', root: departRoot, checkModel: 'multiple', animate:false, onlyLeafCheckable: true, enableDD:false, border:false, rootVisible:true, autoScroll :true, lines: false, loader:dloader, tbar:[ { xtype:'label', text:"文件号:" },{ xtype:"textfield", id:"serchFor5", allowBland:true, width:120 },{ text:"查找", iconCls:"filter", handler : search } ] });
2.创建触发域:
var departTg = new Ext.form.TriggerField({ fieldLabel:'主管部门', width:250, readOnly: true, id:'departTg', name:'departTg', emptyText:"请选择主管部门" });
3.创建窗口:
var departWin = new Ext.Window({ title:'主管部门', width:300, height:260, autoScoll:true, layout:'fit', closeAction:'hide', collapsible:true, items:[departTree], buttons:[{ text:"确定", handler:function(){ var node = departTree.getChecked(); if(node.length == 0){ Ext.Msg.alert("系统提示","请选择主管部门"); return; } var name = new Array(); var value = new Array(); dids = new Array(); for (var i = 0; i < node.length; i++) { dids.push(node[i].id); name.push(node[i].text); value.push(node[i].id); } departTg.setValue(name.join());//给触发域赋值 Ext.getCmp("departid").setValue(value.join()); departWin.hide(); } },{ text:"取消", handler:function(){ departWin.hide(); } } ] });
4.增加单击事件和选择事件:
//选中目录同时展开目录 departTree.on("checkchange",function(node,checked){ if(checked){ node.expand(); } }); //单击时,若是目录则展开或收缩,若是子节点则选中或不选中 departTree.on("click",function(node){ if(!node.isLeaf()){ node.toggle(); } else{ node.ui.toggleCheck(); } });
5.单击触发域打开树窗口并显示勾选项:
departTg.onTriggerClick = departTrigFun; function departTrigFun(e){ departWin.show(); var childNodes = departRoot.childNodes; if(childNodes.length > 0) { showCheckDeparts(childNodes); } else { loadDepart(); } } //加载树并勾选对应项 function loadDepart(){ dloader.on("load",function(treeLoader,node){ showCheckDeparts(node); }); } //勾选对应项 function showCheckDeparts(childNodes){ //先清楚全部勾选项 for (var i = 0; i < childNodes.length; i++) { childNodes[i].ui.toggleCheck(false); } //将触发域中的内容分割为一个数组 departs = departTg.getValue(); childNodes = departRoot.childNodes; var departArr = null; if(departs != null) { departArr = departs.split(","); } //循环对比,相对应的进行勾选 if(departArr != null && departArr.length > 0) { for (var j = 0; j < childNodes.length; j++) { var text = childNodes[j].text; for (var i = 0; i < departArr.length; i++) { if(departArr[i] != text){ continue; } childNodes[j].ui.toggleCheck(true); } } } }
6.图示:
二.选中节点,并展开:
1.创建Tree:
//1 定义根节点 var auditRoot = new Ext.tree.AsyncTreeNode({ id:'tree-root', text:"部门", expanded:true, //根节点默认展开(注意和TreePanel中的rootVisible:true的联系) draggable:false //根节点不可拖动 }); //2 定义节点数据加载器 var auditLoader = new Ext.tree.TreeLoader({ dataUrl:'getKeshiUsersByGrade.up?doType=getKeshiUsersByGrade', //此处不是url,和Store的Proxy不同 baseParams :{pid:''}, baseAttrs:{uiProvider:Ext.tree.TreeCheckNodeUI} //必须有该项,不然树节点无法出现选择框 }); //3 定义数据加载前触发方法 auditLoader.on("beforeload",function(treeLoader,node){ auditRoot.setText(dname); treeLoader.baseParams.pid = node.id; treeLoader.baseParams.did = did; },this); //4 定义树形面板,用于显示数据 var auditTree = new top.Ext.tree.TreePanel({ /**注意top!!!*/ root:auditRoot, //根节点 loader:auditLoader, //数据加载器 checkModel:"single", //复选框只能单选,多选为:multiple,级联:cascade rootVisible:true, //显示根节点 autoScroll:true, animate:false, enableDD:false, //不允许子节点拖动 onlyLeafCheckable:true, width:250 });
2.创建触发域:
var selectedAuditRow;//定义全局变量,获取点击列表某一行时通过复选框获得的行号。 var auditTrigger = new Ext.form.TriggerField({ emptyText:"请选择...", allowBlank:false, readOnly:true });
3.创建窗口:
var auditTreeWin = new top.Ext.Window({ /**注意top!!!*/ title:"用户选择", layout:"fit", closeAction:"hide", modal:true, width:250, height:250, items:auditTree, buttons:[ { text:"确定", handler:function(e){ /*点击选择树节点并将值显示在触发域的方法!*/ var node = auditTree.getChecked(); //获取被选中的树节点 if(!node || node.length < 1){ top.Ext.Msg.alert("系统提示","请选择科室用户!"); return; } var name = new Array(); var value = new Array(); for (var i = 0; i < node.length; i++) { name.push(node[i].text); value.push(node[i].id); } var data = selectedAuditRow.data; //获取选择的行的Record的Data数据对象 /*data["auditUserId"]= name.join(); —— —— 此处用这种方式给触发域赋值出错!!!必须用下面的方式!!! */ auditTrigger.setValue(name.join()); auditTreeWin.hide(); } },{ text:"取消", handler:function(){ auditTreeWin.hide(); } } ] });
4.增加单击事件和选择事件:
//选中目录同时展开目录 auditTree.on("checkchange",function(node,checked){ if(checked){ node.expand(); } }); //单击时,若是目录则展开或收缩,若是子节点则选中或不选中 auditTree.on("click",function(node){ if(!node.isLeaf()){ node.toggle(); } else{ node.ui.toggleCheck(); } });
5.单击触发域打开树窗口并显示勾选项:
/* 单击触发域打开树窗口并显示勾选项 */ auditTrigger.onTriggerClick = clickTriggerFun; function clickTriggerFun(e){ auditTreeWin.show(); var parentNodes = auditRoot.childNodes; if(parentNodes.length > 0) { showCheckedNode(parentNodes); } else { loadTree();//节点为0,则先加载树 } } /* 加载科室用户并勾选对应项 */ function loadTree(){ auditLoader.on("load",function(treeLoader,node){ showCheckedNode(node.childNodes); }); } /* 勾选对应的选中项,并展开选中项的父目录 */ function showCheckedNode(parentNodes){ //先展开再收缩父节点,让子节点充分显示 for (var i = 0; i < parentNodes.length; i++) { parentNodes[i].expand(); parentNodes[i].collapse(); } //先循环清楚全部勾选项 for (var i = 0; i < parentNodes.length; i++) { var childNodes = parentNodes[i].childNodes; for (var j = 0; j < childNodes.length; j++) { childNodes[j].ui.toggleCheck(false); } } //将触发域中的内容字符串分割为一个数组 var tgValue = auditTrigger.getValue(); childNodes = auditRoot.childNodes; var checkedArr = null; if(tgValue != null) { checkedArr = tgValue.split(","); } //循环对比,相对应的进行勾选 if(checkedArr != null && checkedArr.length > 0) { for (var i = 0; i < parentNodes.length; i++) { var childNodes = parentNodes[i].childNodes; for (var j = 0; j < childNodes.length; j++) { var text = childNodes[j].text; for (var k = 0; k < text.length; k++) { if(checkedArr[k] == text) { childNodes[j].ui.toggleCheck(true);//勾选 childNodes[j].parentNode.expand();//展开父节点 } } } } } }
注意:选中节点同时展开其父目录
6.图示:
注意区别:
1.第一个只有一级目录,子节点都在一级目录下,传参用childNodes。
2.第二个有二级目录,子节点都在第二级目录下,传参用parentNodes。
相关推荐
异步加载树型是 ExtJS Tree 的一个重要特性,允许只在需要时动态加载子节点,从而提高页面的加载速度和用户体验。 异步加载通常通过 AJAX 请求实现,只有当用户展开一个节点时,才会向服务器请求该节点的子节点数据...
动态加载是ExtJS Tree的一个重要特性,它允许根据需要加载节点数据,减少了初次加载时的数据量,提高了用户体验。 动态加载,也称为懒加载(Lazy Loading),是指在用户滚动或展开特定节点时才请求并加载该节点及其...
在处理Tree节点时,特别是涉及到链接和新窗口打开的情况,有一些特定的技术要点需要注意。 首先,标题“extjs tree 节点 链接 新窗口”指的是在ExtJS的树形组件中,如何为节点设置链接并在点击时在新窗口中打开。...
ExtJS的Tree组件还提供了一系列事件,如`beforeitemexpand`、`itemexpand`、`itemcollapse`等,这些事件可以在节点展开或收起时触发,允许你在这些时刻执行自定义代码,增加更多功能或进行状态管理。 ### 样式与...
- **展开/折叠**:用户可以点击节点来展开或折叠其子节点,也可以通过API实现。 - **选择**:TreePanel支持单选或多选模式,用户可以选择节点,也可以通过代码选择或取消选择。 - **拖放**:通过配置`draggable`...
通过ExtJs Tree,用户可以直观地展示数据之间的层级关系,并支持多种交互操作,如展开、折叠节点等。 ### 特性与功能 #### 树形面板(Treepanel) - **自动滚动**:通过`autoScroll`属性设置为`true`,确保当内容...
在ExtJS库中,Tree组件允许我们展示和操作数据以树形结构显示,而级联选择功能则意味着当用户选择一个节点时,它的所有子节点也会被自动选中,反之亦然,如果取消选中父节点,其所有子节点也将被取消选中。...
ExtJS Tree 示例是一种基于ExtJS库实现的交互式树形组件,它允许用户在Web应用程序中展示层次结构数据。在本示例中,我们将探讨如何使用ExtJS来创建、访问和操作一个树形结构,特别是在数据库操作方面,如添加和删除...
由于Checkbox Tree支持多级节点,因此在处理全选/全不选或者级联选中时,需要使用递归算法遍历所有子节点,同步它们的选中状态。 9. **样式和模板**: 复选框的样式可以通过CSS自定义,如改变选中、未选中和三态...
ExtJS Tree 是一个功能强大的JavaScript组件,用于在Web应用程序中创建和展示层次结构的数据,它在ExtJS框架中扮演着重要角色。这个压缩包“extjs tree 学习资料”显然是为那些希望深入理解并掌握ExtJS Tree组件的...
ExtJS Tree是基于ExtJS框架实现的一种数据结构展示方式,它主要用于展示层级关系的数据,例如组织结构、文件系统等。ExtJS是一个强大的JavaScript库,专为构建富客户端Web应用程序而设计,提供了丰富的组件化功能和...
ExtJs 2.2.1 tree实例,内附mysql数据文件 1. 数据节点一次性加载 2. 节点分为两个类(项目和设备) 3. 右键菜单 4. 节点增、删、改操作 ....... 后台是java struts1。 本例旨在说明extjs的tree操作,后台操作很简陋...
ExtJS Tree + JSON + Struts2 示例源代码是结合了三种技术来实现一个动态的、交互式的树形数据展示的应用。这个示例中,ExtJS用于前端UI的构建,JSON作为数据交换格式,而Struts2则作为后端MVC框架处理请求和返回...
ExtJS Tree是一个强大的JavaScript库,专门用于创建交互式的树形结构。这个"extjs-tree.zip"文件包含了使用Java编写的ExtJS异步树形控件的示例代码,旨在帮助开发者快速理解和应用这一功能。ExtJS是Sencha公司开发的...
在本篇文章中,我们将深入探讨如何在ExtJS框架中获取TreePanel中所有被选中(checked)的叶子节点的ID。此技术对于处理复杂的数据结构、优化用户交互体验以及实现高效的数据管理至关重要。 ### 一、ExtJS简介 ...
通过这种方式,我们解决了 Struts2 JSON 插件返回数据格式与 ExtJS Tree 期待格式不匹配的问题。现在,树形菜单应该能够正确地动态加载并显示从服务器获取的数据。这个例子展示了如何在实际开发中灵活应对数据格式...
- `itemclick`: 节点被点击时触发。 - `beforeexpand`: 节点展开前触发,可进行验证或阻止展开。 - `expand`: 节点展开后触发。 - `beforecollapse`: 节点折叠前触发。 - `collapse`: 节点折叠后触发。 5. **...
ExtJS AJAX Tree是一种基于JavaScript的动态树形结构,它利用AJAX技术来异步加载节点数据,无需在服务器端生成完整的树结构。这种方式可以显著提高页面加载速度,尤其是在处理大量数据时。ExtJS是一个功能丰富的...
在给定的文件中,我们关注的是“带复选框的ExtJS tree”这一主题,这涉及到ExtJS框架下的树形组件(TreePanel)如何与复选框结合,为用户提供更为灵活的数据选择和管理方式。 ### 标题解析:“带复选框的ExtJS tree...
ExtJS Tree组件提供了丰富的功能和自定义选项,包括节点的拖放操作、异步加载、复选框、分页以及各种事件监听等。 本教程旨在帮助开发者深入理解和熟练运用ExtJS Tree。通过eclipse项目导入提供的源码,你可以看到...