Ext.js中树勾选的四种操作
最近在做控件优化的时候产品提了一个需求,对树的勾选要满足四种勾选方案:
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中树勾选的四种操作的更多相关文章
- JS中遍历对象属性的四种方法
Object.keys().Object.values().Object.entries().for...in.Map (1)Object.keys(): let ex1 = {c1: 'white' ...
- winfrom C#树勾选等
AfterCheck /// <summary> /// 树勾选 /// </summary> /// <param name="sender"> ...
- Ext JS中Button的一般使用
Ext JS中Button按钮的显示,以及按钮的部分事件 一.属性 renderTo:将当前对象所生成的HTML对象存放在指定的对象中 text:得到按钮名称 minWidth:按钮最小宽度 hidd ...
- Ext JS中的typeOf
Ext JS中的typeOf:以字符串格式,返回给定变量的类型 其中对字符串对象.元素节点.文本节点.空白文本节点判断并不准确 测试代码如下: <!DOCTYPE HTML PUBLIC &qu ...
- winfrom 树勾选
树勾选 /// <summary> /// 树勾选 /// </summary> /// <param name="sender"></p ...
- Python中函数传递参数有四种形式
Python中函数传递参数有四种形式 fun1(a,b,c) fun2(a=1,b=2,c=3) fun3(*args) fun4(**kargs) 四种中最常见是前两种,基本上一般点的教程都会涉及, ...
- C#中方法的参数的四种类型
C#中方法的参数有四种类型: 1. 值参数类型 (不加任何修饰符,是默认的类型) 2. 引用型参数 (以ref 修饰符声明) 3. 输出型参数 (以out 修 ...
- 领域模型中的实体类分为四种类型:VO、DTO、DO、PO
http://kb.cnblogs.com/page/522348/ 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: V ...
- C语言中返回字符串函数的四种实现方法 2015-05-17 15:00 23人阅读 评论(0) 收藏
C语言中返回字符串函数的四种实现方法 分类: UNIX/LINUX C/C++ 2010-12-29 02:54 11954人阅读 评论(1) 收藏 举报 语言func存储 有四种方式: 1.使用堆空 ...
随机推荐
- 基于随机游走的三维网格分割算法(Random Walks)
首先以一维随机游走(1D Random Walks)为例来介绍下随机游走(Random Walks)算法,如下图所示,从某点出发,随机向左右移动,向左和向右的概率相同,都为1/2,并且到达0点或N点则 ...
- nanopi NEO2 学习笔记 2:安装 pip 和 pip 安装第三方模块
我现在越来越喜欢用python做开发了,特别是知道了python还能用rpi.gpio库操作 NEO2 的 io 口之后,更是激动 在进行一下的操作之前,要先更换国内的 apt arm64 源,并更新 ...
- Python基础 2-2 列表的实际应用场景
引言 本章主要介绍列表在实际应用中的使用场景,多维列表(嵌套列表) 如果你需要在列表保存每个人员的一些基本信息,使用列表嵌套来保存这种信息是个不错的主意. 多维列表 列表可以根据实际情况嵌套使用,比如 ...
- [开源] FreeSql.AdminLTE 功能升级
前言 FreeSql 发布至今已经有9个月,功能渐渐完善,自身的生态也逐步形成,早在几个月前写过一篇文章<ORM 开发环境之利器:MVC 中间件 FreeSql.AdminLTE>,您可以 ...
- Fire Balls 05——子弹的命中及后续效果
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- 互联网从此没有 BAT
根据 Wind 数据截止2019年8月30日,中国十大互联网上市公司排名中,百度排名第 6 位市值 365 亿美元,阿里巴巴排名第一市值高达 4499 亿美元,腾讯排名第二市值 3951 亿美元. 1 ...
- Python实现 下载IJCAI会议所有论文
import requests import threading def get_file_content(num): savepath = '%04d.pdf' % (num) suburl = ' ...
- odoo12从零开始:二、个性化定制odoo12 之 创建数据库页面
剧情回顾 上一文章,我们已经成功运行了odoo12,并访问localhost:8069看到如下界面: 我们还没有创建数据库,但是我们发现,数据库管理页面的logo是odoo,数据库页面全是英文的,对于 ...
- 背包形动态规划 fjutoj2375 金明的预算方案
金明的预算方案 TimeLimit:1000MS MemoryLimit:128MB 64-bit integer IO format:%lld Problem Description 金明今天 ...
- webapi 参数传递详解
原因 经常有朋友遇到webapi参数传递问题,自己也碰到过一些坑,在此记录下正确的姿势,简单参数传递相信没有人会有问题,容易出现问题的是对象参数和表单参数. 1.WebApi5.2.3有FromBod ...