2

我有一个简单的 ExtJS 4.1 复选框 TreePanel。树建立在简单的逻辑之上。

  1. 如果选择任何节点的所有子节点,则取消选择所有子节点并选择父节点。
  2. 如果选择父节点,请取消选择所有子节点。

请使用以下模拟上述要求的小提琴。 通过小提琴的例子

Ext.create('Ext.tree.Panel', {
    title: 'Simple Tree',
    renderTo: Ext.getBody(),
    width: 400,
    height: 400,
    store: {
        root: {
            expanded: true,
            children: [{
                checked: false,
                text: "1 detention",
                expanded: true,
                children: [{
                    checked: false,
                    text: '1.1 foo',
                    leaf: false,
                    children: [{
                        checked: false,
                        text: "1.1.1 India",
                        expanded: true
                    }, {
                        checked: false,
                        text: "1.1.2 Singapore",
                        expanded: true
                    }, {
                        checked: false,
                        text: "1.1.3 USA",
                        expanded: true
                    }]
                }, {
                    checked: false,
                    text: '1.2 bar',
                    leaf: true
                }]
            }, {
                checked: false,
                text: "2 homework",
                expanded: true,
                children: [{
                    checked: false,
                    text: "2.1 book report",
                    leaf: true
                }, {
                    checked: false,
                    text: "2.2 algebra",
                    expanded: true,
                    children: [{
                        checked: false,
                        text: "2.2.1 buy lottery tickets",
                        leaf: true
                    }, {
                        checked: false,
                        text: "2.2.2 buy lottery tickets 2",
                        leaf: true
                    }]
                }, {
                    checked: false,
                    text: "2.3 English report",
                    leaf: true
                }]
            }, {
                checked: false,
                text: "3 buy lottery tickets",
                leaf: true
            }]
        }
    },
    rootVisible: false,
    disableSelection: true,
    //selModel: {mode: 'SIMPLE'},
    listeners: {
        checkchange: function (record, checked, opts) {
            if (!checked) return;
            var parentNode = record.parentNode;

            // Deselect children
            function deselectChildren(record) {
                record.eachChild(function (record) {
                    record.set('checked', false);
                    deselectChildren(record);
                });
            }
            deselectChildren(record);

            // See if all siblings are selected now
            var allSiblingSelected = false;
            if (parentNode) {
                allSiblingSelected = parentNode.childNodes.reduce(function (previous, node) {
                    return previous && node.get('checked');
                }, true);
            }

            if (allSiblingSelected) {
                parentNode.set('checked', true);
                // Apparently won't fire on its own. Below line creates problem
                this.fireEvent('checkchange', parentNode, true, opts);
            }

            // Deselect ancestors
            else {
                while (parentNode) {
                    parentNode.set('checked', false);
                    parentNode = parentNode.parentNode;
                }
            }
        }
    }
});

当你看到代码时,你会看到当一个节点的所有兄弟节点都被选中时,我手动将父节点的“已检查”配置设置为 true,然后在第 96 行手动触发父节点的 checkchange 事件将取消选择所有子节点。

问题:有时,此事件不会被触发,并且树会产生不一致的结果。如果我放置调试点或使用 console.log,系统每次都会触发此事件。

我观察到的有趣的事情是,当您调试代码或使用 console.log 编写一些调试信息时,系统会正常工作。我假设checkchange有时我手动触发的事件不会被触发fireEvent

当我为父节点设置 'checked' 配置或者我可以使用任何其他方法时,我必须自动触发 checkchange 事件的选项。

请帮忙

谢谢

4

0 回答 0