2013-05-21 21 views
0

我有一个grid.Panel内部绑定到商店的视口。一旦网格(或商店)加载后,我想查看第一行(或任何行)中的值,如果它是假的,则隐藏网格中的列。我已经尝试了许多不同的事件,但在这里,在我的控制器的例子:extjs4 mvc事件调试结果不一致

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]并查看第一行。所以看起来一切都很好,我应该能够根据隐藏网格的数据在函数中添加条件。但这并不奏效 - 这就是事情变得怪异的地方。

如果我替换“停止”;用“调试器”,并重新加载,这次我们得到了visual studio调试器。但是现在,在IE屏幕上,我只能看到网格标题,而没有任何数据。而grid.store.data.items是一个空数组。我恢复的那一刻,我看到了整个电网。

但这并非全部。如果我的功能是: onGridLoad:function(grid){ alert('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(); 
    } 
}, 

但如果警报已被注释掉,也不会隐藏的列。

任何想法或解释为什么这可能会不胜感激。

回答

0

我猜这里的问题与商店的异步加载有关。视图准备就绪后,您可能会看到一秒钟的竞赛状况,但该商店尚未填充。就像在量子物理中一样,对事件的观察正在改变它的结果:)

我的建议是在商店中放置一个负载监听器,然后注入处理过程。

0

我认为@dbrin在假定商店中的数据尚未加载时是正确的。但是,当商店加载时间非常快并且视图尚未准备好时,对商店加载进行处理可能也是有问题的。

viewready: function(grid){ 
    grid.getView().on({ 
     refresh: { 
      fn: function(){ 
       if (grid.store.findExact('is_rcm', false) >= 0) { 
        grid.columns[6].hide(); 
       } 
      }, 
      single: true 
     } 
    }); 
} 

而且here is a fiddle,在这里你可以设置存储加载延迟测试不同的加载时间:当任后或视图前的数据准备好以下应该工作。