Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.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 extjs4 mvc事件调试结果不一致_Javascript_Model View Controller_Extjs_Extjs4 - Fatal编程技术网

Javascript extjs4 mvc事件调试结果不一致

Javascript extjs4 mvc事件调试结果不一致,javascript,model-view-controller,extjs,extjs4,Javascript,Model View Controller,Extjs,Extjs4,我在绑定到商店的视口中有一个grid.Panel。加载网格(或存储)后,我希望查看第一行(或任何行)中的值,如果为false,则隐藏网格中的列。我尝试了许多不同的事件,但我的控制器中有一个示例: Ext.define('HelperBatchForm.controller.BatchController', { extend: 'Ext.app.Controller', stores: [ 'Batches' ], models: [ 'Batch' ], views: [

我在绑定到商店的视口中有一个grid.Panel。加载网格(或存储)后,我希望查看第一行(或任何行)中的值,如果为false,则隐藏网格中的列。我尝试了许多不同的事件,但我的控制器中有一个示例:

Ext.define('HelperBatchForm.controller.BatchController', {
extend: 'Ext.app.Controller',
stores: [
    'Batches'
],
models: [
    'Batch'
],
views: [
    'batch.BatchGrid',
    'batch.BatchEdit'
],
init: function () {
    this.control({
        'batchgrid': {
            itemdblclick: this.editBatch                
            ,viewready: this.onGridLoad
        }
    });
},
onGridLoad: function(grid){
    stop;
},
“停止”抛出错误并在IE浏览器中打开调试器。在浏览器本身上,我可以看到网格和行已完全渲染。在调试器中,我可以查看grid.store.data.items[0]并查看第一行。看起来一切都很好,我应该能够根据隐藏网格的数据在函数中设置一个条件。但这是行不通的——这就是事情开始变得奇怪的地方

如果我将“stop;”替换为“debugger;”并重新加载,那么这次我们将得到VisualStudio调试器。但是现在,在IE屏幕中,我只能看到网格标题,而没有任何数据。grid.store.data.items是一个空数组。我一恢复,就看到了整个网格

但这还不是全部。如果我的职能是: onGridLoad:功能(网格){ 警报(“onGridLoad”); 调试器; }, 现在,加载visual studio调试器后,我可以在IE中看到完整的网格和数据。grid.store.data.items[0]为我提供了第一行。如果我用条件代码替换“调试器”,它就可以工作了!换句话说,我有一些代码不起作用,但如果我在它前面抛出alert(),它会突然开始起作用

总而言之,下面的代码将隐藏该列:

onGridLoad: function (grid) {
    alert('onGridLoad');
    if (grid.store.findExact('is_rcm', false) >= 0) {
        grid.columns[6].hide();
    }
},
但是,如果该警报被注释掉,它将不会隐藏该列


如果您有任何想法或解释,我们将不胜感激

我猜这里的问题与存储的异步加载有关。您可能会在视图准备就绪但存储尚未填充的瞬间看到一个竞争条件。就像在量子物理学中,对事件的观察正在改变其结果:)


我的建议是在存储上放置一个负载侦听器,并在该点注入您的处理

我认为@dbrin假设存储中的数据尚未加载是正确的。但是,当存储加载时间非常快,并且视图还没有准备好时,在存储加载上进行处理也可能会有问题。当数据在视图之后或之前准备好时,以下操作应起作用:

viewready: function(grid){
    grid.getView().on({
        refresh: {
            fn: function(){
                if (grid.store.findExact('is_rcm', false) >= 0) {
                    grid.columns[6].hide();
                }  
            },
            single: true
        }
    });
}
并且,您可以设置存储加载延迟以测试不同的加载时间