ExtJS Tree checkchange 侦听器不显示掩码

ExtJS Tree checkchange listener does not display mask

我有一个带复选框的 Ext 树,当单击任何复选框时,它将启动一个可能需要任意时间的过程。为了更加用户友好,我想向树中添加一个加载掩码。但是,当进入侦听器函数时,UI 锁定并且在侦听器函数完成之前不会更新。该问题出现在 ExtJs 4.2 - 7.5 经典版中。

如果我在包含处理代码的掩码后添加“setTimeout()”,或者在掩码后设置断点,则掩码将显示。问题是IE似乎不支持setTimeout()函数。

这里有一个 fiddle 示例代码,处理函数只是计算一个非常大的数字来模拟处理时间 - https://fiddle.sencha.com/#view/editor&fiddle/3hl2

这是实际代码:

Ext.application({
    name: 'ExtTest',
    launch: function () {
        Ext.create('ExtTest.view.Viewport');
    }
});

Ext.define('ExtTest.view.Viewport', {
    extend: 'Ext.container.Viewport',
    initComponent: function () {
        this.items = [{
            xtype: 'treetest'
        }]
        this.callParent();
    }
});

Ext.define('ExtTest.view.TreeTest', {
    extend: 'Ext.tree.Panel',
    alias: 'widget.treetest',
    height: '100%',
    width: '100%',

    initComponent: function () {
        console.log('Creating tree');
        var me = this;
        var store = Ext.create('Ext.data.TreeStore', {
            fields: ['text'],
            root: {
                text: 'root',
                expanded: true,
                children: me.getTreeData()
            }

        })

        Ext.applyIf(this, {
            store: store,
            columns: [{
                width: "100%",
                xtype: 'treecolumn',
                dataIndex: 'text'
            }],
            listeners: {
                checkchange: function () {
                    me.getEl().mask('loading');
                    me.factorNumber(500000000);
                    me.getEl().unmask();
                }
            }
        });

        this.callParent();
    },

    factorNumber: function (aNumber) {
        for (var i = 1; i <= aNumber; i++) {
            if (aNumber % i === 0) {
                console.log(i);
            }
        }
    },

    getTreeData: function () {
        return [{
            text: 'child 1',
            leaf: true,
            checked: false
        }, {
            text: 'child 2',
            leaf: true,
            checked: false
        }, {
            text: 'child 3',
            leaf: true,
            checked: false
        }];
    }
});

您的问题是,您的函数在 dom 可以更新之前耗尽了所有资源。

解决方案是让加载掩码有时间出现,然后开始计算。

               checkchange: function () {
                    me.getEl().mask('loading');
                    Ext.defer(function() {
                        me.factorNumber(500000000);
                        me.getEl().unmask();
                    }, 50);
                }