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);
}
我有一个带复选框的 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);
}