未捕获的TypeError:无法调用未定义的方法'getLeft'

时间:2014-01-30 10:23:25

标签: extjs error-handling extjs4.1

我有一个非常好的MVC应用程序。但是我继续得到 ext-all.js 错误 - “未捕获的TypeError:当我向左移动时,无法调用未定义的方法'getLeft' UI的结尾。

这个错误似乎无害,但我似乎无法找出抛出此错误的根本原因(组件)。

非常感谢帮助!

详细错误如下:

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

2 个答案:

答案 0 :(得分:1)

你应该使用ext的dev / debug版本而不是压缩的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在没有渲染标题的情况下没有做任何特殊事情,如果我们从{{1返回一些虚假的东西,它会表现相同}}

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

isOnLeftEdge

<强>更新

然后,同样的事情发生在右边缘......你可以用类似的补丁防止错误。不幸的是,在此之后你可能会发现另一个错误。查看onHeaderCtMouseMove的代码。如果您为if (!Ext.getVersion().isLessThan('4.2')) alert('Retest me please!'); isOnLeftEdge返回false,则执行路径将在此行中运行:

isOnRightEdge

同样,预计标题的元素存在。而你的错误表明,在你的特定情况下,它没有。您可以防止整个情况立即发生以换取一小笔开销(因为我们正在复制一些将在super方法中再次执行的代码):

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未定义。他们为什么不一样?那是你应该调查的。如果你插入上面的代码,你会在崩溃的情况下暂停;这就是答案所在......

答案 1 :(得分:0)

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

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

突然,执行中间,我遇到了这个错误。我回滚了我的一些代码并改变了添加上面列的方法:

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

并删除了 id 属性。现在,这个错误消失了。希望这些信息对某人有所帮助。我确信这个错误是因为一些不容易被事件处理的错误代码。