Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 调用Ext setLoading(true,true)太晚了?_Javascript_Extjs_Combobox_Extjs4_Extjs4.1 - Fatal编程技术网

Javascript 调用Ext setLoading(true,true)太晚了?

Javascript 调用Ext setLoading(true,true)太晚了?,javascript,extjs,combobox,extjs4,extjs4.1,Javascript,Extjs,Combobox,Extjs4,Extjs4.1,我有一个包含大量数据的网格,用户可以使用组合框过滤或显示/隐藏列组。一些列开关需要很长时间才能加载,我想在网格或组合框上调用setLoading(true,true),向用户显示浏览器正在工作 我有一个侦听器函数,当用户在组合框上进行选择时调用该函数。在开始执行任何需要一段时间的代码之前,我调用combo.setLoading(true,true)。然后我在函数的最底部调用combo.setLoading(false,false) 加载仅在两个setLoading调用之间的代码执行后的一瞬间显示

我有一个包含大量数据的网格,用户可以使用组合框过滤或显示/隐藏列组。一些列开关需要很长时间才能加载,我想在网格或组合框上调用setLoading(true,true),向用户显示浏览器正在工作

我有一个侦听器函数,当用户在组合框上进行选择时调用该函数。在开始执行任何需要一段时间的代码之前,我调用combo.setLoading(true,true)。然后我在函数的最底部调用combo.setLoading(false,false)

加载仅在两个setLoading调用之间的代码执行后的一瞬间显示。如果我调用删除加载图标,图标仍然只在代码执行后显示

有人知道发生了什么吗?我觉得这很奇怪

categorycomboselect: function(combo, records){
    combo.setLoading(true,true);
    var panel = combo.up('panel');
    console.log(panel);
    var category = records[0].data.name;
    var grid = Ext.ComponentQuery.query('grid')[1];
    Ext.suspendLayouts();
    grid.suspendedLayout=true;
    var columns = grid.columns;//.getView().getGridColumns();
    //slow code that shows/hides columns
    grid.suspendedLayout=false;
    Ext.resumeLayouts(true);
    combo.setLoading(false,false);
},
更新

这是我的代码和Trimboli的建议,它仍然不起作用。我根据列ID中的字符串显示/隐藏列。我这样做是因为我要显示/隐藏列的类别是动态的,列是动态的

categorycomboselect: function(combo, records){
    combo.setLoading(true,true);
    setTimeout( function(){
            var panel = combo.up('panel');
            var category = records[0].data.name;
            var grid = Ext.ComponentQuery.query('grid')[1];
            Ext.suspendLayouts();
            grid.suspendedLayout=true;
            var columns = grid.columns;
            if(category=='All grade items'){
                for(var i = 0; i< columns.length; i++){
                        columns[i].setVisible(true);
                }
            }else{
                for(var i = 0; i< columns.length; i++){
                    columns[i].hide();//setVisible(false);
                    if(!(typeof columns[i].itemId ==='undefined')){
                        if((columns[i].itemId).indexOf(category)>=0){
                            columns[i].show();
                        }
                    }
                }
            }
            grid.suspendedLayout=false;
            Ext.resumeLayouts(true);
            combo.setLoading(false,false);
    },1);
},

是否做同样的事情。如果没有,哪一个更好。

你实际上是这样做的:

showMask();
for (i = 0; i < 10000000; ++i) {
    // busy loop
}
hideMask();

听起来你的
//显示/隐藏列的慢代码是异步执行的,因此你在问题中显示的代码在其他代码仍显示/隐藏列时完成运行。有什么办法吗?我在某处读到一些关于回调函数的东西,我想它被调用了。将我的慢代码移动到一个单独的函数中会不会阻止此错误的发生?请原谅,这是对的,您只会在几秒钟内看到加载掩码,因为更改列的代码开始异步执行,因此它会继续执行到例程的末尾,并在操作完成之前删除加载掩码。您将需要捕获更新操作后激发的事件,类似事件,但这可能因应用“显示/隐藏列”解决方案的方式而异。这是不正确的。代码同步运行。因为您没有正确调用超时<代码>设置超时
需要函数引用。您正在调用
busy
并将结果(
undefined
)传递给
setTimeout
showMask();
for (i = 0; i < 10000000; ++i) {
    // busy loop
}
hideMask();
showMask();
setTimeout(function() {
    // Busy stuff
    hideMask();
}, 1);