热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Extjs3.4中TreePanel含复选框树选中状态级联处理详解(含半选)

这里讨论TreePanel树含复选框且允许半选状态存在方式,当选中某节点时时,向上和向下的选中情况处理。在允许含半选的情况下,在异步动态获

这里讨论TreePanel树含复选框且允许半选状态存在方式,当选中某节点时时,向上和向下的选中情况处理。在允许含半选的情况下,在异步动态获取节点数据时,通常都会在返回节点JSON数组数据中包含indeterminate属性。这里需要注意的是:当json数据对象中indeterminate为true时,无论checked为true或false,对应的节点初始化时都会显示为半选状态,并且节点属性checked和indeterminate值都为true。当json数据对象中indeterninate为false时,若checked为true,则初始化节点显示为选中状态,节点属性checked值为true,indeterninate为false;若checked为false时,则初始化节点显示为未选中状态,节点属性checked为false,indeterninate为false。

Html中CheckBox和Ext中CheckBox区别:
1、初始化设置。若Html的CheckBox中indeterminate属性设置为true时,check属性为false;若Extjs的CheckBox中indeterminate属性设置为true,则check属性会为true。
2、动态使用代码改变状态设置。Html中若CheckBox的indeterminate属性值被设置为true,check属性值不会改变;Extjs中CheckBox的Indeterminate属性被设置为true时,需同时更改其UI的Indeterminate属性值为true,并且不会改变其check值,所以需处理使其改变(这里通常会把check属性也设置为true。目的:为了使其在后面代码中用getChecked方法能同时获取到半选和全选复选框)。

Html中CheckBox和Ext中CheckBox相同点:
1、默认不设置indeterminate属性时。Html和Extjs中在初始化不设置的情况下indeterminate属性默认为false。
2、单击改变选中状态:Html中CheckBox在被单击改变复选框状态时,无论之前其indeterminate属性值为true或false,check值会变成相应的true或false,在单击后indeterminate值都会被设置为false。Extjs中CheckBox在被单击时,无论之前indeterminate属性和UI值是true还是false,单击后indeterminate的属性值和UI值都会被设置为false,并且check属性及其UI值都会被改变成对应的属性值。


下面为新建TreePanel实例。
情况一:当选中某节点时,展开并选中所有子孙节点;当取消选中某节点时,级联取消选中所有已加载子孙节点。复选框状态改变时都实现与上级节点关联。

var tree = new Ext.tree.TreePanel({id:'itree',loader: new Ext.tree.TreeLoader({dataUrl:'findTreeNode.action',baseParams:{}}),//是否显示线lines:true,autoScroll:true,root: new Ext.tree.AsyncTreeNode({text: '根节点',draggable: false,id: '0'}),//不显示根节点rootVisible:false,listeners:{'checkchange':function(node,checked){checkAttrSyn(node);//实现UI与属性选中状态同步if(checked){//当选中当前节点时,展开并选中所有子孙节点expandInherit(node);}else{checkChilds(node);}checkParent(this,node);}}
})

var tree = new Ext.tree.TreePanel({id:'itree',loader: new Ext.tree.TreeLoader({dataUrl:'findTreeNode.action',baseParams:{}}),//是否显示线lines:true,autoScroll:true,root: new Ext.tree.AsyncTreeNode({text: '根节点',draggable: false,id: '0'}),//不显示根节点rootVisible:false,listeners:{'checkchange':function(node,checked){checkAttrSyn(node);//实现UI与属性选中状态同步if(checked){//当选中当前节点时,展开并选中所有子孙节点expandInheritIncUI(node);}else{checkChilds(node);}checkParent(this,node);}}
})

以上两种实现推荐使用第一种。

情况二:
1、若单击选中(或取消选中)本节点,会级联选中(或取消选中)其已加载子孙节点
2、展开本节点时,若本节点为选中(或未选中)状态时,会将本节点选中状态应用于已加载子孙节点;若本节点为半选状态,则不会影响子节点选中状态。
3、复选框状态改变时都实现与上级节点关联。

var tree = new Ext.tree.TreePanel({id:'itree',loader: new Ext.tree.TreeLoader({dataUrl:'findTreeNode.action',baseParams:{}}),//是否显示线lines:true,autoScroll:true,root: new Ext.tree.AsyncTreeNode({text: '根节点',draggable: false,id: '0'}),//不显示根节点rootVisible:false,listeners:{'checkchange':function(node,checked){checkAttrSyn(node);//实现UI与属性选中状态同步if(node.loaded) checkChildsIncUI(node);//当本节点子节点已加载,则调用checkChilds方法checkParent(this,node);},//展开节点后触发'beforeexpandnode':function(node){checkChilds(node);}}
})

var tree = new Ext.tree.TreePanel({id:'itree',loader: new Ext.tree.TreeLoader({dataUrl:'findTreeNode.action',baseParams:{}}),//是否显示线lines:true,autoScroll:true,root: new Ext.tree.AsyncTreeNode({text: '根节点',draggable: false,id: '0'}),//不显示根节点rootVisible:false,listeners:{'checkchange':function(node,checked){checkAttrSyn(node);//实现UI与属性选中状态同步if(node.loaded) checkChildsIncUI(node);//当本节点子节点已加载,则调用checkChilds方法checkParent(this,node);},//展开节点后触发'expandnode':function(node){checkChildsIncUI(node);}}
})

以上两种实现推荐使用第一种。

从上面TreePanel实例中可以看出,在选择某个节点复选框或展开某个节点时都有监听处理,其作用是同时向上和向下对节点进行选中状况处理。这里用到了一个属性同步和五个递归的辅助方法,其代码如下:

//实现当前节点UI与TreeNode选择状态属性同步
checkAttrSyn = function(node){node.attributes.checked = node.ui.checkbox.checked;node.attributes.indeterminate = node.ui.checkbox.indeterminate;
};//展开当前节点下所有子孙节点,并将当前节点选中状态应用于子孙节点(同时应用属性和UI)
expandInheritIncUI = function(node){if(node.isExpanded()){//若该节点已展开,则将当前节点选中状态应用于该节点下所有子孙节点checkChilds(node);node.eachChild(function(child){expandInheritIncUI(child);});}else{var customfun = null;node.on("expand",customfun = function(){checkChilds(node);node.eachChild(function(child){expandChildsIncUI(child);});node.removeListener("expand",customfun,this);});node.expand();//展开当前节点子节点}
};//展开当前节点下所有子孙节点,并将当前节点选中状态应用于子孙节点(只应用属性)
expandInherit = function(node){if(node.isExpanded()){//若该节点已展开,则将当前节点选中状态应用于该节点下所有子孙节点checkChilds(node);node.eachChild(function(child){expandInherit(child);});}else{var customfun = null;node.on("beforeexpand",customfun = function(){checkChilds(node);node.eachChild(function(child){expandInherit(child);});node.removeListener("beforeexpand",customfun,this);});node.expand();//展开当前节点子节点}
};//将当前节点的选中状态(全选和未选),包括属性和UI应用于向下的所有(已加载)子孙节点
checkChildsIncUI = function(node){var checked = node.attributes.checked;var half = node.attributes.indeterminate;node.eachChild(function(child){if(Ext.isBoolean(half) && !half){//判断当前节点是否为半选(半选将不应用于子孙节点)child.attributes.checked = checked;child.ui.checkbox.checked = checked;child.attributes.indeterminate = half;child.ui.checkbox.indeterminate = half;}checkChilds(child);});
};//将当前节点的选中状态(全选和未选),只属性应用于向下的所有(已加载)子孙节点
checkChilds = function(node){var checked = node.attributes.checked;var half = node.attributes.indeterminate;node.eachChild(function(child){if(Ext.isBoolean(half) && !half){//判断当前节点是否为半选(半选将不应用于子孙节点)child.attributes.checked = checked;child.attributes.indeterminate = half;}checkChilds(child);});
};//选中当前节点时,对向上的父节点选中状态进行处理
checkParent = function(tree,node){var parentNode = node.parentNode;//由于根节点隐藏且没有复选框,所以当当前节点父节点为根节点时不再对父节点(根节点)进行选中状态处理if(tree.root.attributes.id != parentNode.attributes.id){//父节点中子节点半选个数计数var halfcount = 0;//父节点中子节点选中个数计数var checkedCount = 0;//父节点中子节点数var childCount = parentNode.childNodes.length;parentNode.eachChild(function(child){if(child.attributes.indeterminate){halfcount++;}else if(child.attributes.checked){checkedCount++;}});if(checkedCount == childCount){//若父节点中子节点已被全选,则选中父节点parentNode.attributes.checked = true;parentNode.ui.checkbox.checked = true;parentNode.attributes.indeterminate = false;parentNode.ui.checkbox.indeterminate = false;}else if(halfcount > 0 || checkedCount > 0){//若父节点的部分子节点为选中或半选时,父节点为半选状态parentNode.attributes.checked = true;parentNode.ui.checkbox.checked = true;parentNode.attributes.indeterminate = true;parentNode.ui.checkbox.indeterminate = true;}else{//若父节点中子节点未被全选,则将父节点置为不选中parentNode.attributes.checked = false;parentNode.ui.checkbox.checked = false;parentNode.attributes.indeterminate = false;parentNode.ui.checkbox.indeterminate = false;}checkParent(tree,parentNode);}
};

 


这样,当树中某节点被选中时,向上和向下的节点处理就完成了。

 


推荐阅读
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 本文探讨了在PHP中实现MySQL分页查询功能的优化方法与实际应用。通过详细分析分页查询的常见问题,提出了多种优化策略,包括使用索引、减少查询字段、合理设置缓存等。文章还提供了一个具体的示例,展示了如何通过优化模型加载和分页参数设置,显著提升查询性能和用户体验。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 提升Android开发效率:Clean Code的最佳实践与应用
    在Android开发中,提高代码质量和开发效率是至关重要的。本文介绍了如何通过Clean Code的最佳实践来优化Android应用的开发流程。以SQLite数据库操作为例,详细探讨了如何编写高效、可维护的SQL查询语句,并将其结果封装为Java对象。通过遵循这些最佳实践,开发者可以显著提升代码的可读性和可维护性,从而加快开发速度并减少错误。 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
author-avatar
憨哇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有