我有一个非常好的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
答案 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 属性。现在,这个错误消失了。希望这些信息对某人有所帮助。我确信这个错误是因为一些不容易被事件处理的错误代码。