2014-01-30 86 views
1

我有一个完美的MVC应用程序。但我一直得到这个ext-all.js错误 - “未捕获TypeError:无法调用方法'getLeft'未定义”当我移动到结束的用户界面。Uncaught TypeError:无法调用未定义的方法'getLeft'

该错误似乎无害,但我似乎无法确定引发此事的根本原因(组件)。

非常感谢帮助!

详细的错误如下:

Uncaught TypeError: Cannot call method 'getLeft' of undefined ext-all.js:18 
    Ext.define.isOnLeftEdge ext-all.js:18 
    Ext.define.onHeaderCtMouseMove ext-all.js:18 
    (anonymous function) VM1221:6 
    g ext-all.js:18 

回答

1

您应该使用分机,而不是压缩EXT-all.js的开发/调试版本上的异常功能调试的目的(和条件断点和/或停止你的调试器)...在你的情况下,错误的方法可能是Ext.grid.column.Column#isOnLeftEdge

该方法被调用的未定义的东西是该列的元素。我们可以推断,问题可能是在测试发生之前,您的列不会被渲染。这不是自从网格创建以来从未显示过的隐藏列吗?组件元素未定义的一个非常常见的原因是某些代码被延迟调用,并且组件在事件被触发和处理程序被实际执行之间被销毁......但是在这里显然不是这种情况。

无论如何,这似乎是在Ext代码库中的一个小故障。这部分的lib(网格,视图渲染等)在4.2.1中已经被重写了很多,所以也许更新你的Ext版本会让问题消失。如果你仍然需要坚持你的版本一段时间,你可以重写错误的方法,以防止错误(即仍然调试噪音),像这样:

Ext.define('Ext.ux.fix.Ext.grid.column.Column', { 
    override: 'Ext.grid.column.Column' 

    ,isOnLeftEdge: function(e) { 
     return this.el && this.callParent(arguments); 
    } 
}); 

我们可以做到这一点相当不错的信心,因为我们看到calling method在头文件没有呈现的情况下没有做任何特别的事情,如果我们从isOnLeftEdge返回一些虚假的东西,它将表现相同。

最后,您应该在此文件中添加一个Ext版本的测试,以帮助您在最终更新Ext时保持代码清洁。例如:

if (!Ext.getVersion().isLessThan('4.2')) alert('Retest me please!'); 

更新

然后,同样的事情发生在右边缘......你或许可以防止误用类似的补丁。不幸的是,之后你可能会期待另一个错误。看代码onHeaderCtMouseMove。如果您为isOnLeftEdgeisOnRightEdge返回false,执行路径会往下跑这条线:

overHeader.el.dom.style.cursor = ''; 

在这里,预计头部的元素存在。而你的错误表明,在你的特定情况下,它不会。您可以防止整个局势交换一次发生了一个小的开销(因为我们要复制一些代码,将在超级方法再次执行):

Ext.define('Ext.ux.fix.Ext.grid.plugin.HeaderResizer', { 
    override: 'Ext.grid.plugin.HeaderResizer' 

    ,onHeaderCtMouseMove: function(e, t) { 
     // we've got no problem when we're dragging 
     if (!this.headerCt.dragging) { 
      var headerEl = e.getTarget('.' + this.colHeaderCls, 3, true), 
       overHeader = Ext.getCmp(headerEl.id); 
      if (!overHeader.el) { 
       // that's the crashy case, so we're stopping process here 

       // ... but what about trying to understand how we could end 
       // here in the first place? look around, there's something 
       // to be found ;) ! 
       debugger 

       return; 
      } 
     } 
     // we're safe, continue 
     this.callParent(arguments); 
    } 
}); 

现在是想都不用想办法修复。但是,你可能会想尝试和了解到底发生了什么......我们可以看到,onHeaderCtMouseMove已经试图避免处理未渲染的列标题:

headerEl = e.getTarget('.' + me.colHeaderCls, 3, true); 

if (headerEl){ 
    overHeader = Ext.getCmp(headerEl.id); 

此代码可能预计headerEl从事件和overHeader.el抢到是相同的。而在你的情况下,他们不是,因为headerEl通过了测试,但overHeader.el未定义。他们为什么不一样?这就是你应该调查的。如果你插入我的上面的代码,你会在发生崩溃的情况下暂停;这就是答案所在......

+0

我在4.1版本上,但最终想在不破坏任何现有功能的情况下移动到后面的版本。这非常有帮助。谢谢@rixo – isuvaish

+0

在为上述问题添加修复程序后,我现在正在引发'inOnRightEdge'错误。 – isuvaish

+0

你需要调试它,看到我更新的答案。我不能说为什么这个代码没有运行在你的特定情况下没有运行的测试用例再现问题。 – rixo

0

我也遇到了这个问题。在我的场景中(如this链接所述),我在网格面板中动态创建了一个模板列。我给ID为每列,并增加电网如下:

var temp={ 
xtype:'templatecolumn', 
id:'mycolumn', 
tpl:'...' 
} 
//adding temp to grid panel 

突然,实施中间,我遇到这个错误。我回滚我的一些代码,改变将上述列的方法:

var temp=Ext.create('Ext.grid.TemplateColumn',{ 
.... 
}); 

和删除ID属性。现在,那个错误消失了。希望这个信息会帮助别人。我相信这个错误是由于一些容易出错的代码没有被事件处理。

相关问题