博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ext.js中树勾选的四种操作
阅读量:4486 次
发布时间:2019-06-08

本文共 3714 字,大约阅读时间需要 12 分钟。

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

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.再根据点击的该节点的初始状态就可以进行逻辑判断,达到效果。

 

转载于:https://www.cnblogs.com/GuliGugaLiz/p/10648117.html

你可能感兴趣的文章
Linux基本命令参数
查看>>
Django系列(一)
查看>>
【ASP.NET Web API教程】2.3.3 创建Admin控制器
查看>>
第二类斯特林数
查看>>
Mysql
查看>>
JQuery中简约的进度条插件推荐
查看>>
url override and HttpSession implements session for form
查看>>
servlet乱码问题
查看>>
反射+特性实现 类和XML文档的序列化反序列化
查看>>
日常方法
查看>>
解决Ueditor在bootstarp 模态框中全屏问题
查看>>
POJ 1006 Biorhythms
查看>>
dubbo+zookeeper注册服务报错问题:No service registed on zookeeper
查看>>
极验滑动验证登录
查看>>
求多个数的质因子
查看>>
laravel的orm作用
查看>>
文件锁
查看>>
props和state
查看>>
LeetCode:Unique Paths I II
查看>>
AcWing 兔子与兔子
查看>>