Ext.tree.TreeCheckNodeUI 前面是通过这个组件实现的父节点和子节点的级联 但是源码貌似很复杂个人认为,因此不需要通过这个组件实现. 通过以下这两个函数实现类似的功能. visitAllTreeNodeFun(node, checked); if (node.parentNode && node.parentNode.getUI().checkbox != null) { checkParentFun(node.parentNode); } 但是遇到个新问题,当获取选中的节点时候,只能获取鼠标点击的那个节点,比如点击某一子节点,相关联 的父节点被选中,但是父节点获取不到,级联的相关联节点都获取不到,查询相关资料,改正此处 treeNode.childNodes[i].ui.toggleCheck(checked);//选中 需要先选中,再赋值,才可以获取选中的节点,加上上面的红色那句话就可以了.此时又有个新问题 选中事件发生在子节点,但要通过toggleCheck()改变其父节点未被选中的状态,而一旦改变了父节点未被选中状态为选中状态,就会激发树中的<CheckChange Handler="check(node)" />事件 ,每次激发,传入的节点值node一直在改变,陷入一个死循环。 因此要加入suspendEvents()停止监听事件,执行完后再恢复监听 Ext.onReady(function() { Ext.QuickTips.init(); this.tree = new Ext.tree.TreePanel({ id:'tree', region: 'center', autoScroll: true, animate: true, width: '280', collapsible: (this.centerRegion=='center' ? false : true), split: true, // tbar: [{xtype:"button",text:"logout",listeners:{ "click":function(){ssd(); }} // }], tbar:[' ', new Ext.form.TextField({ width:150, emptyText:'快速检索', enableKeyEvents: true, listeners:{ keyup:function(node, event) { findByKeyWordFiler(node, event); }, } }) ], enableDD: true, // checkModel: 'cascade', //对树的级联多选 // onlyLeafCheckable: false,//对树所有结点都可选 containerScroll: true, border: false, loader: new Ext.tree.TreeLoader({ url:'/neFunction/test', //baseAttrs: { uiProvider: Ext.tree.TreeCheckNodeUI }//解决了获取树节点的级联多选问题 }), root: new Ext.tree.AsyncTreeNode({ id: "0", level: "0", text:"菜单树" }), listeners: { 'checkchange': function (node, checked) { tree.suspendEvents(); //暂停所有监听事件的执行 visitAllTreeNodeFun(node, checked); if (node.parentNode && node.parentNode.getUI().checkbox != null) { checkParentFun(node.parentNode); } tree.resumeEvents(); //重新开始所有监听事件的执行 } }, rootVisible: true }); this.tree.getRootNode().expand(); this.tree.addListener("click",this.ClickNode); this.contextMenu = new Ext.menu.Menu({ id:"treeContextMenu", items:[ { text:"查看", handler:function() { Ext.Msg.alert("...",Ext.getCmp('tree').getSelectionModel().getSelectedNode().id); } } ] }); this.tree.on("contextmenu",function(node,e) { e.preventDefault(); // 阻止弹出默认右键菜单 node.select(); // 选中节点 Ext.getCmp("treeContextMenu").showAt(e.getXY()); }); var timeOutId = null; var treeFilter = new Ext.tree.TreeFilter(tree, { clearBlank : true, autoClear : true }); // 保存上次隐藏的空节点 var hiddenPkgs = []; var findByKeyWordFiler = function(node, event) { clearTimeout(timeOutId);// 清除timeOutId tree.expandAll();// 展开树节点 // 为了避免重复的访问后台,给服务器造成的压力,采用timeOutId进行控制,如果采用treeFilter也可以造成重复的keyup timeOutId = setTimeout(function() { // 获取输入框的值 var text = node.getValue(); // 根据输入制作一个正则表达式,'i'代表不区分大小写 var re = new RegExp(Ext.escapeRe(text), 'i'); // 先要显示上次隐藏掉的节点 Ext.each(hiddenPkgs, function(n) { n.ui.show(); }); hiddenPkgs = []; if (text != "") { treeFilter.filterBy(function(n) { // 只过滤叶子节点,这样省去枝干被过滤的时候,底下的叶子都无法显示 return !n.isLeaf() || re.test(n.text); }); // 如果这个节点不是叶子,而且下面没有子节点,就应该隐藏掉 tree.root.cascade(function(n) { if(n.id!='0'){ if(!n.isLeaf() &&judge(n,re)==false&& !re.test(n.text)){ hiddenPkgs.push(n); n.ui.hide(); } } }); } else { treeFilter.clear(); return; } }, 500); }; // 过滤不匹配的非叶子节点或者是叶子节点 var judge =function(n,re){ var str=false; n.cascade(function(n1){ if(n1.isLeaf()){ if(re.test(n1.text)){ str=true;return; } } else { if(re.test(n1.text)){ str=true;return; } } }); return str; }; new Ext.Viewport({ renderTo:Ext.getBody(), layout : 'border', autoShow:true, items: [this.tree] }); }); function ClickNode(node){ console.info(node.attributes.id); } /** 父节点的选择 */ function checkParentFun (treeNode) { var i; var check = false; var nocheck = false; if (treeNode.hasChildNodes()) { for (i = 0; i < treeNode.childNodes.length; i++) { if (treeNode.childNodes[i].getUI().checkbox.checked) { check = true; } else { nocheck = true; } } } if (check == true && nocheck == false) { // 可以全选 treeNode.getUI().checkbox.checked = true; } else if (check == true && nocheck == true) { // 半选 孩子节点既有选中的也有未选中的 这种情况则父节点还是选中 treeNode.ui.toggleCheck(true); treeNode.getUI().checkbox.checked = true; if(treeNode.parentNode&& treeNode.parentNode.getUI().checkbox != null){ checkParentFun(treeNode.parentNode); } } else if (check == false && nocheck == true) { // 全不选 孩子节点都是未选中的则父节点取消选中 treeNode.ui.toggleCheck(false); treeNode.getUI().checkbox.checked = false; treeNode.collapse();//父节点收缩 if(treeNode.parentNode&& treeNode.parentNode.getUI().checkbox != null){ checkParentFun(treeNode.parentNode); } } }; /** 孩子节点的选择 */ function visitAllTreeNodeFun (treeNode,checked) { var i; checked ? treeNode.expand() : treeNode.collapse();//点击某一节点让子节点都展开全部展开 if (treeNode.hasChildNodes()) { for (i = 0; i < treeNode.childNodes.length; i++) { if (treeNode.childNodes[i].getUI().checkbox) { treeNode.childNodes[i].ui.toggleCheck(checked);//选中 treeNode.childNodes[i].getUI().checkbox.checked = checked;// visitAllTreeNodeFun(treeNode.childNodes[i],checked); } } } }; /** 根据路径对于节点的选择以及获取选中的节点 */ function ssd(){ tree.expandPath("/0/201/401/511");// var treeNode = Ext.getCmp("tree").getNodeById("511"); if (treeNode) { treeNode.getUI().checkbox.checked = true; } var checkedNodes = Ext.getCmp("tree").getChecked(); var s = []; for (var i = 0; i < checkedNodes.length; i++) { s.push(checkedNodes[i].text); } alert(s); }
相关推荐
在ExtJS库中,Tree组件允许我们展示和操作数据以树形结构显示,而级联选择功能则意味着当用户选择一个节点时,它的所有子节点也会被自动选中,反之亦然,如果取消选中父节点,其所有子节点也将被取消选中。...
实现ExtJS ComboBox级联的关键在于理解其数据绑定和事件监听机制。以下是一些关键知识点: 1. **数据源**:ComboBox的数据通常来自一个远程服务器或者本地数据结构,如Store。Store负责加载和管理数据,它可以是...
在这个"extjs mvvm增删查改模糊查询"主题中,我们将深入探讨如何使用ExtJS的MVVM模式来实现对数据的操作,包括添加、删除、修改和查找,同时结合模糊查询功能,提高用户体验。 首先,MVVM模式的核心在于ViewModel层...
在本文中,我们将探讨如何实现ExtJS动态树以及其中的节点拖拽功能。动态树是一种能够实时更新和修改的树形结构,允许用户添加、删除和移动节点。这种功能在各种应用场景中非常有用,如文件系统、组织结构或层级数据...
说明:本例主要实现在树节点数据过多的情况下对数据进行异步请求,并且在请求数据返回前台的同时实现级联选择。使用ExtJs版本为4.1.1a,在struts2下测试通过。例子仅供提供思路,简单易懂,不负责代码优化,哈哈!
总结来说,EXTJS的ComboBox级联实现涉及了Store、Proxy、JsonReader、事件监听以及ComboBox的配置选项。通过合理设置这些组件和属性,可以构建出具有动态联动效果的下拉菜单,同时确保在数据提交时正确地传递选定的...
在这个特定的情况下,我们讨论的是一个定制的下拉树菜单控件——ComboBoxTree,它在ExtJS4中实现了单选和多选功能,并且具备展开选中指定节点的能力。这个控件在实际项目中已经被广泛使用并证明了其稳定性和实用性,...
3. **扩展CheckboxSelectionModel**:自定义控件可能通过继承并扩展ExtJS的CheckboxSelectionModel,添加必要的功能,如`cascadeSelect`和`cascadeDeselect`方法,来实现级联操作。 4. **渲染逻辑**:控件可能需要...
extJs4 ComboBox 代码组合框实例,ComboBox 各个主要参数详细解释
在ExtJS中,这种功能主要通过`Ext.tree.TreePanel`或其现代版本`Ext.tree.View`来实现。 一、ExtJS 动态树基础 1. `Ext.tree.TreePanel`:这是ExtJS中用于创建树形结构的主要组件。它具有丰富的配置项和事件,支持...
总之,“Ext TreePanelrcheckbox级联选择的实现”涉及了ExtJS的TreePanel组件和复选框模型的使用,通过监听事件和自定义逻辑实现了节点间的选择级联。这种功能在具有层级结构的数据选择场景中非常常见,如权限管理、...
本文将详细介绍如何使用ExtJS框架设置级联菜单的默认值。首先,需要明白在ExtJS中设置普通控件(如文本框)的默认值相对简单,通常只用一行代码即可完成。然而,对于ComboBox(下拉列表组件)来说,情况就没那么简单...
在这个目录下,你可能会找到`.js`文件,里面包含了实现上述功能的ExtJS代码,以及可能的HTML和CSS文件来展示这个应用。开发者可能通过阅读这些代码,了解如何将ExtJS组件和动画结合起来,以创建具有翻页效果的电子书...
功能: 1.实现ExtJS tree 节点右键菜单 实现增删查. 2.实现针对实体数据的动态搜索. 3.代码命名规范,简单易懂. 4.支持IE 9,FF 19.0.2. 5.将文件解压至ext包example任意组件文件夹即可浏览效果.
在这个"ExtJS实现聊天功能"的项目中,我们将探讨如何利用ExtJS框架构建一个类似于QQ的聊天应用程序。 首先,我们要理解聊天功能的核心要素。一个基本的聊天应用通常包含以下部分: 1. **用户界面**:ExtJS提供了...
级联选择(Cascading Selection)则是指当用户选中一个节点时,其所有子节点都会自动被选中,反之,如果取消选中父节点,所有子节点也会随之被取消选中。这种功能在组织结构、文件系统或权限管理等场景下非常有用。 ...
最近小弟做了Extjs实现实现下拉框联动的效果,参考了好久才学会,闲下来发一个简单的例子。。呵呵
总结来说,“extjs实现增删查改”涵盖了前端使用ExtJS组件进行数据操作,以及后端使用servlet、Spring和Hibernate进行数据处理的技术栈。这个过程涉及到了前端交互设计、数据模型管理、HTTP通信和数据库操作等多个...
综上所述,"extjs2.0 画的一个带查询条件和查询结果的页面"涉及到的技术点主要包括ExtJS的组件使用、表单创建、事件处理、数据网格展示、Ajax通信以及布局管理。通过熟练掌握这些知识点,可以创建出功能完备且用户...
需要注意的是,实例代码的介绍以及功能的实现都需要依赖于ExtJS框架的API以及面向对象编程的相关知识。只有熟悉了ExtJS框架中TreePanel组件的使用,才能够更好地理解和运用这些方法来开发具有复杂交互的Web应用程序...