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

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. 单元测试之NUnit二

    NUnit 分三篇文章介绍,入门者可阅读文章,有基础者直接参考官方文档.初次写博客,望大家指点. 导航: 单元测试之NUnit一 单元测试之NUnit二 单元测试之NUnit三 本文介绍常用的NUni ...

  2. Docker学习总结(五)--迁移与备份

    将容器保存为镜像 docker commit myNginx mynginx_i 镜像备份 docker save -o myNginx.tar myNginx_i 镜像恢复 docker load ...

  3. Liunx软件安装之Zabbix监控软件

    Zabbix 是什么 zabbix(音同 za:bix)是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix 能监视各种网络参数,保证服务器系统的安全运营 ...

  4. 探索JAVA并发 - 终于搞懂了sleep/wait/notify/notifyAll

    > sleep/wait/notify/notifyAll分别有什么作用?它们的区别是什么?wait时为什么要放在循环里而不能直接用if? ## 简介 首先对几个相关的方法做个简单解释,Obje ...

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

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

  6. cogs 1199选课(树形dp 背包或多叉转二叉

    http://cogs.pro:8080/cogs/problem/problem.php?pid=vQyiJkkPP 题意:给m门课,每门课在上完其先修课后才能上,要你从中选n门课使得总学分尽可能大 ...

  7. Atcode B - Colorful Hats(思维)

    题目链接:http://agc016.contest.atcoder.jp/tasks/agc016_b 题解:挺有意思的题目主要还是模拟出最多有几种不可能的情况,要知道ai的差距不能超过1这个想想就 ...

  8. codeforces E. Trains and Statistic(线段树+dp)

    题目链接:http://codeforces.com/contest/675/problem/E 题意:你可以从第 i 个车站到 [i + 1, a[i]] 之间的车站花一张票.p[i][j]表示从 ...

  9. 在React中使用Bootstrap

    这几天想在react中用一下bootstrap,尽管有一个适配react的很好的库叫react-bootstrap,但我还是想直接使用bootstrap 可以在react项目中执行以下命令安装boot ...

  10. DataReader转换

    public static partial class Extension { private static ConcurrentDictionary<Type, ConcurrentDicti ...