Extjs:网格因 Ext.grid.column.Widget 而崩溃
Extjs: grid crashes because of the Ext.grid.column.Widget
大家好!
我在 beforerender 组件的 Ext.grid.Panel 事件中创建了一个 Ext.grid.column.Widget:
var column = Ext.create('Ext.grid.column.Widget', {
text : '...',
width : 200,
onWidgetAttach: function(column, widget, record) {
// simple operations
},
widget: {
xtype : 'button',
text : '...',
listeners: {
click: function(me, event, eOpts) {
// simple operations
}
}
}
});
然后我将其附加到主要 Ext.grid.Panel 组件:
grid.headerCt.insert(2, column);
在这个舞台上一切都很好,显示了带有按钮的列并且表现良好,但是......
还有一些附加功能 - window 通过单击其他单元格(网格列)打开,它使用 ViewController 和 onCellclick 它调用:
record.callJoined('afterCommit', [fieldName]);
然后崩溃:
tracing显示崩溃发生在这里(ext-all-rtl-debug.js):
updateColumns: function(oldRow, newRow, columnsToUpdate, record) {
...
// Replace changed cells in the existing row structure with the new version
// from the rendered row.
for (colIndex = 0; colIndex < colCount; colIndex++) {
column = columnsToUpdate[colIndex];
// Pluck out cells using the column's unique cell selector.
// Because in a wrapped row, there may be several TD elements.
cellSelector = me.getCellSelector(column);
oldCell = oldRow.querySelector(cellSelector);
newCell = newRow.querySelector(cellSelector);
// Copy new cell attributes across.
newAttrs = newCell.attributes; // HERE IS THE CLUE????
attLen = newAttrs.length;
for (attrIndex = 0; attrIndex < attLen; attrIndex++) {
attName = newAttrs[attrIndex].name;
value = newAttrs[attrIndex].value;
if (attName !== 'id' && oldCell.getAttribute(attName) !== value) {
oldCell.setAttribute(attName, value);
}
}
console.log(newCell.attributes)
显示这样的 gridcolumn 属性:
但是在小部件列上,属性变量似乎等于 null。
我注意到 grid.columns 数组只包含网格列而不包含小部件列。
我需要做什么来解决这个错误?
这是一个带有动态网格构造函数的大型项目,因此我无法在 fiddle 中生成它。
您是否尝试过使用 reconfigure
方法而不是使用像 headerCt
这样的私有属性(在我看来这是个坏主意)?
像这样使用它:
grid.reconfigure(columns);
需要在beforerender
活动中吗?我建议重写 initComponent
函数。
通过向 Ext.grid.column.Widget 对象添加必要的参数解决了问题:
dataIndex: 'WidgetColumn',
大家好!
我在 beforerender 组件的 Ext.grid.Panel 事件中创建了一个 Ext.grid.column.Widget:
var column = Ext.create('Ext.grid.column.Widget', {
text : '...',
width : 200,
onWidgetAttach: function(column, widget, record) {
// simple operations
},
widget: {
xtype : 'button',
text : '...',
listeners: {
click: function(me, event, eOpts) {
// simple operations
}
}
}
});
然后我将其附加到主要 Ext.grid.Panel 组件:
grid.headerCt.insert(2, column);
在这个舞台上一切都很好,显示了带有按钮的列并且表现良好,但是......
还有一些附加功能 - window 通过单击其他单元格(网格列)打开,它使用 ViewController 和 onCellclick 它调用:
record.callJoined('afterCommit', [fieldName]);
然后崩溃:
tracing显示崩溃发生在这里(ext-all-rtl-debug.js):
updateColumns: function(oldRow, newRow, columnsToUpdate, record) {
...
// Replace changed cells in the existing row structure with the new version
// from the rendered row.
for (colIndex = 0; colIndex < colCount; colIndex++) {
column = columnsToUpdate[colIndex];
// Pluck out cells using the column's unique cell selector.
// Because in a wrapped row, there may be several TD elements.
cellSelector = me.getCellSelector(column);
oldCell = oldRow.querySelector(cellSelector);
newCell = newRow.querySelector(cellSelector);
// Copy new cell attributes across.
newAttrs = newCell.attributes; // HERE IS THE CLUE????
attLen = newAttrs.length;
for (attrIndex = 0; attrIndex < attLen; attrIndex++) {
attName = newAttrs[attrIndex].name;
value = newAttrs[attrIndex].value;
if (attName !== 'id' && oldCell.getAttribute(attName) !== value) {
oldCell.setAttribute(attName, value);
}
}
console.log(newCell.attributes)
显示这样的 gridcolumn 属性:
但是在小部件列上,属性变量似乎等于 null。
我注意到 grid.columns 数组只包含网格列而不包含小部件列。
我需要做什么来解决这个错误?
这是一个带有动态网格构造函数的大型项目,因此我无法在 fiddle 中生成它。
您是否尝试过使用 reconfigure
方法而不是使用像 headerCt
这样的私有属性(在我看来这是个坏主意)?
像这样使用它:
grid.reconfigure(columns);
需要在beforerender
活动中吗?我建议重写 initComponent
函数。
通过向 Ext.grid.column.Widget 对象添加必要的参数解决了问题:
dataIndex: 'WidgetColumn',