您应该使用分机,而不是压缩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
。如果您为isOnLeftEdge
和isOnRightEdge
返回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
未定义。他们为什么不一样?这就是你应该调查的。如果你插入我的上面的代码,你会在发生崩溃的情况下暂停;这就是答案所在......
我在4.1版本上,但最终想在不破坏任何现有功能的情况下移动到后面的版本。这非常有帮助。谢谢@rixo – isuvaish
在为上述问题添加修复程序后,我现在正在引发'inOnRightEdge'错误。 – isuvaish
你需要调试它,看到我更新的答案。我不能说为什么这个代码没有运行在你的特定情况下没有运行的测试用例再现问题。 – rixo