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

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. Raven 2 靶机渗透

    0X00 前言 Raven 2中一共有四个flag,Raven 2是一个中级boot2root VM.有四个标志要捕获.在多次破坏之后,Raven Security采取了额外措施来强化他们的网络服务器 ...

  2. helm安装kafka集群并测试其高可用性

    介绍 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据. 这种动作( ...

  3. 使用Makefile构建Docker

    使用Makefile构建Docker 刚开始学习docker命令的时候,很喜欢一个字一个字敲,因为这样会记住命令.后来熟悉了之后,每次想要做一些操作的时候就不得不 重复的输入以前的命令.当切换一个项目 ...

  4. HTML5实时语音通话聊天,MP3压缩传输3KB每秒

    目录 一.把玩方法 二.技术特性 (1)数据传输 (2)音频采集和编码 (3)音频实时接收和播放 三.应用场景 自从Recorder H5 GitHub开源库优化后,对边录边转码成小语音片段文件实时上 ...

  5. Leetcode之分治法专题-169. 求众数(Majority Element)

    Leetcode之分治法专题-169. 求众数(Majority Element) 给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是 ...

  6. Python--函数参数类型、用法及代码示例

    在编程语言里,将一个个功能定义成函数,能够进行反复调用,而不是每次都重复相同的代码,这种方式能够大幅度降低代码的复杂度. 函数的好处: 1.代码重用 2.保持一致性 3.可扩展性 1.基础 我们定义函 ...

  7. JAVA 泛型中的通配符 T,E,K,V,?

    前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的数据 ...

  8. eclipse中导入外部包却无法查看对应源码或Javadoc的入坑指南

    eclipse中导入外部包却无法查看对应源码或Javadoc的 入坑指南 出现这个错误的原因是,你虽然导入了.jar包,但没有配置对应的Javadoc或源码路径,所以在编辑器中无法查看源 码和对应AP ...

  9. SPOJ - QTREE4 Query on a tree IV 边分治

    题目传送门 题意:有一棵数,每个节点有颜色,黑色或者白色,树边有边权,现在有2个操作,1修改某个点的颜色, 2询问2个白点的之前的路径权值最大和是多少. 题解: 边分治思路. 1.重构图. 因为边分治 ...

  10. CF - 1131 D Gourmet choice

    题目传送门 先把 = 的人用并查集合并在一起. 然后 < > 的建边, 跑一遍 toposort 之后就好了. 入度为0点的值肯定为1, 然后就是因为这个是按照时间线走过来的,所以一个点的 ...