0

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

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();
    }
},

但是如果警报被注释掉,它不会隐藏该列。

任何关于为什么会这样的想法或解释都将不胜感激。

4

2 回答 2

0

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

我的建议是在商店中放置一个负载侦听器,然后在此时注入您的处理。

于 2013-05-21T18:33:00.640 回答
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
        }
    });
}

是一个 fiddle,您可以在其中设置存储加载延迟以测试不同的加载时间。

于 2013-05-21T21:43:06.133 回答