我在应用程序中有一个网格。一切顺利。然后,我想更改网格以使用保存配置中的不同列。这也很好 - 除非我先在列上打开一个过滤器菜单。在此之后,更改列布局会在重新配置功能中导致内部错误,其中焦点将重新应用于网格。以下是Ext.view.Table类中发生错误的代码:
onFocusEnter: function(e) {
var me = this,
fromComponent = e.fromComponent,
navigationModel = me.getNavigationModel(),
focusPosition,
br = me.bufferedRenderer,
focusRecord, focusRowIdx, focusTarget, scroller;
// Focusing an internal focusable while TD navigation is disabled;
// We do not intervene.
if (me.actionableMode) {
return;
}
// The underlying DOM event
e = e.event;
// We can only focus if there are rows in the row cache to focus *and* records
// in the store to back them. Buffered Stores can produce a state where
// the view is not cleared on the leading end of a reload operation, but the
// store can be empty.
if (!me.cellFocused && me.all.getCount() && me.dataSource.getCount()) {
问题是me.dataSource为null。我发现这很奇怪,因为在此行之前的注释确定了使用缓冲存储时空存储的潜在问题 - 我是 - 并且对此没有任何作用。
我肯定在重新配置功能中提供了一个有效的存储,因为除非首先显示过滤器菜单,否则它可以正常工作。有什么想法吗?
答案 0 :(得分:0)
我进一步研究了这个,并检查了为什么dataSource值应为null。在调用堆栈中,我们通过Ext.util.StoreHolder类来绑定存储。这包括将商店绑定到侦听器然后引发事件以让系统对更改做出反应的代码。
bindStore: function(store, initial, propertyName) {
...
if (store !== oldStore) {
if (oldStore) {
... lines to unbind the old store
}
if (store) {
me[propertyName] = store = Ext.data.StoreManager.lookup(store);
me.bindStoreListeners(store);
me.onBindStore(store, oldStore);
} else {
me[propertyName] = null;
它在onStindStore中发生错误。我在它之前添加了代码来从源设置dataSource并且错误消失了。
虽然它有效,但我有点犹豫不决,因为它正在改变真正的ExtJs代码。如果您能想出更好的答案,请分享。