Javascript extjs4 mvc事件调试结果不一致
我在绑定到商店的视口中有一个grid.Panel。加载网格(或存储)后,我希望查看第一行(或任何行)中的值,如果为false,则隐藏网格中的列。我尝试了许多不同的事件,但我的控制器中有一个示例: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: [
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
}
});
}
并且,您可以设置存储加载延迟以测试不同的加载时间