【问题标题】:extjs4 mvc event debugging inconsistent resultsextjs4 mvc事件调试结果不一致
【发布时间】:2013-05-21 14:43:42
【问题描述】:

我在绑定到商店的视口中有一个 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:函数(网格){ 警报('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();
    }
},

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

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

【问题讨论】:

    标签: javascript model-view-controller extjs extjs4


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我认为@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,在这里可以设置存储加载延迟来测试不同的加载时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-09
        • 1970-01-01
        • 2014-09-21
        • 2021-06-12
        • 2016-06-03
        • 2012-02-19
        • 2014-06-03
        • 1970-01-01
        相关资源
        最近更新 更多