最近在做控件优化的时候产品提了一个需求,对树的勾选要满足四种勾选方案:

1.点击一次根节点,当根节点和子节点均未选中的情况下,根节点和子节点全都选中。

2.第二次点击根节点,当根节点和部分或全部子节点都选中的情况下,仅选中根节点,子节点不选中。

3.第三次点击根节点,当根节点未选中,且无子节点全未选中的情况下,选中所有子节点,根节点不选中。

4.第四次点击根节点,当根节点未选中,但存在选中的子节点的情况下,根节点和子节点均不选中。

5.点击子节点,可以选中取消。

 完整代码:

操作位代码:

{
xtype: 'actioncolumn',
width: 48,
text:'选择',
align: 'center',
stopSelection: true,
sortable: false,
menuDisabled: true,
items: [{
width: 13,
height: 13, handler: function (view, rowIdx, colIdx, item, evt) {
var sto = view.getStore();
var rec = sto.getAt(rowIdx);
var check = rec.get('Checked');
if (isNaN(check)) check = 0;
if (check == -1) return;
me.setLoading("loading");
if (check == 1) { //点击的节点是选中状态
check = 0;
me.checkNode(rec, false);
} else { //点击的节点是未选中状态
check = 1;
me.checkNode(rec, true);
}
me.setLoading(false);
}
}]
} 核心代码:
checkNode: function (rec, checked) {
var me = this;
var check = 0;
var hasCheckedNode = false; //是否有子节点选中
var hasNodes = false; //是否有子节点
rec.cascade(function (r) { //遍历子节点
var len = r.get('children');
if (len) {
hasNodes = true;
}
if (!r.isLeaf() && !r.isExpanded()) {
r.expand();
}
if (r.get('Checked') == 1 && !len ) { //节点有选中,而且选中的不是父节点本身
hasCheckedNode = true;
} });
if (!checked) {
if (hasCheckedNode && hasNodes) {
//前提:父子节点都选中;效果:父节点选中,子节点不选中。
check = 1; //下级全部取消
rec.cascade(function (r) {
if (r.get('Checked') !== 0)
r.set('Checked', 0);
});
} else if (!hasCheckedNode && hasNodes) {
//前提:父节点选中,子节点未选中;效果:父节点不选中,子节点选中。
check = 0; //下级全部选中
rec.cascade(function (r) {
if (r.get('Checked') !== 1)
r.set('Checked', 1);
}); } else if (!hasCheckedNode && !hasNodes) {
//该节点是无子节点的节点
check = 0; } } else {
if (hasCheckedNode && hasNodes) {
//前提:父节点不选中,子节点选中;效果:父节点都不选中。
check = 0;
//下级全不选中
rec.cascade(function (r) {
if (r.get('Checked') != 0) {
r.set('Checked', 0);
} });
} else if (!hasCheckedNode && hasNodes) {
//前提:父子节点不选中;效果:父子节点都选中。
check = 1;
//下级选中
rec.cascade(function (r) {
if (r.get('Checked') != 1) {
r.set('Checked', 1);
} });
} else if (!hasCheckedNode && !hasNodes) {
//该节点是无子节点的节点
check = 1; } }
rec.set('Checked', check);
} });

Tree.js

核心点分析:

1.首先要确定我们点击的是根节点还是子节点。所以定义了

var hasNodes = false;         //是否有子节点

2.要分别控制根节点跟子节点的话,那点击根节点的时候要查看是否有子节点选中,所以继续定义了

var hasCheckedNode = false;   //是否有子节点选中

3.再根据点击的该节点的初始状态就可以进行逻辑判断,达到效果。

Ext.js中树勾选的四种操作的更多相关文章

  1. JS中遍历对象属性的四种方法

    Object.keys().Object.values().Object.entries().for...in.Map (1)Object.keys(): let ex1 = {c1: 'white' ...

  2. winfrom C#树勾选等

    AfterCheck /// <summary> /// 树勾选 /// </summary> /// <param name="sender"> ...

  3. Ext JS中Button的一般使用

    Ext JS中Button按钮的显示,以及按钮的部分事件 一.属性 renderTo:将当前对象所生成的HTML对象存放在指定的对象中 text:得到按钮名称 minWidth:按钮最小宽度 hidd ...

  4. Ext JS中的typeOf

    Ext JS中的typeOf:以字符串格式,返回给定变量的类型 其中对字符串对象.元素节点.文本节点.空白文本节点判断并不准确 测试代码如下: <!DOCTYPE HTML PUBLIC &qu ...

  5. winfrom 树勾选

    树勾选 /// <summary> /// 树勾选 /// </summary> /// <param name="sender"></p ...

  6. Python中函数传递参数有四种形式

    Python中函数传递参数有四种形式 fun1(a,b,c) fun2(a=1,b=2,c=3) fun3(*args) fun4(**kargs) 四种中最常见是前两种,基本上一般点的教程都会涉及, ...

  7. C#中方法的参数的四种类型

    C#中方法的参数有四种类型:       1. 值参数类型  (不加任何修饰符,是默认的类型)       2. 引用型参数  (以ref 修饰符声明)       3. 输出型参数  (以out 修 ...

  8. 领域模型中的实体类分为四种类型:VO、DTO、DO、PO

    http://kb.cnblogs.com/page/522348/ 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: V ...

  9. C语言中返回字符串函数的四种实现方法 2015-05-17 15:00 23人阅读 评论(0) 收藏

    C语言中返回字符串函数的四种实现方法 分类: UNIX/LINUX C/C++ 2010-12-29 02:54 11954人阅读 评论(1) 收藏 举报 语言func存储 有四种方式: 1.使用堆空 ...

随机推荐

  1. F#周报2019年第34期

    新闻 高效的F#,提示与技巧 Fable 社区资源 Visual Studio提示与技巧:为.NET增加生产力 无风险地尝试Compositional IT的培训包--如果没有增加任何价值,可以得到完 ...

  2. Docker学习总结(二)--Docker安装与启动

    注:笔者使用的环境为 CentOS 7.6,如果版本不一致可能会出现一些错误. 安装 Docker 1)将 yum 包更新到最新版本 sudo yum update 2) 安装需要的软件包 sudo ...

  3. HTTP head请求

    GET: 请求指定的页面信息,并返回实体主体. HEAD: 只请求页面的首部. POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体. PUT: 从客户端向服务器传送的数据取代指定 ...

  4. Codeforces 1009D

    题意略. 思路: 可知对于一个拥有n个点的图来说,它至少需要有n - 1条边来维持连通性,而且数字1恰好与后面的n - 1个数字互质: 至于n个点的图可以产生合法的互质边的个数的上限,我们可以通过莫比 ...

  5. [Python] Django框架入门

    说明:Django框架入门 当前项目环境:python3.5.django-1.11 项目名:test1 应用名:booktest 命令可简写为:python manager.py xxx => ...

  6. MSIL实用指南-比较运算

    数值的比较就是大于.小于.等于.大于等于.小于等于.不等于,它们的运算结果都是布尔值.大于.小于.等于有直接对应的指令,分别是Cgt.Clt.Ceq.大于等于.小于等于.不等于没有直接对应的指令,它的 ...

  7. TypeScript进阶开发——ThreeJs基础实例,从入坑到入门

    前言 我们前面使用的是自己编写的ts,以及自己手动引入的jquery,由于第三方库采用的是直接引入js,没有d.ts声明文件,开发起来很累,所以一般情况下我们使用npm引入第三方的库,本文记录使用np ...

  8. HDU 5919 - Sequence II (2016CCPC长春) 主席树 (区间第K小+区间不同值个数)

    HDU 5919 题意: 动态处理一个序列的区间问题,对于一个给定序列,每次输入区间的左端点和右端点,输出这个区间中:每个数字第一次出现的位子留下, 输出这些位子中最中间的那个,就是(len+1)/2 ...

  9. Redis哨兵(Sentinel)模式快速入门

    更多内容,欢迎关注微信公众号:全菜工程师小辉.公众号回复关键词,领取免费学习资料. 当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用. ...

  10. 深入浅出理解EdgeBoard中NHWC数据格式

    摘要: 在深度学习中,为了提升数据传输带宽和计算性能,经常会使用NCHW.NHWC和CHWN数据格式,它们代表Image或Feature Map等的逻辑数据格式(可以简单理解为数据在内存中的存放顺序) ...