组件在重新渲染期间丢失,如何重新附加?
Component lost during rerender, how to reattach?
我正在将组件渲染到网格中 rowExpander 插件 rowBodyTpl:
plugins: [{
ptype: 'rowexpander',
rowBodyTpl : [
'<div id="contact-row-{Id}"> </div>'
]
}],
var row = 'contact-row-' + record.get('Id'),
grid = Ext.getCmp(gridId),
if(!grid) me.createSubGrid(record,gridId).render(row);
这很好用。但是当网格接收到具有某些修改字段的记录的 update
事件时,该记录的 rowExpander 仅使用 rowTpl 重新呈现,并且内部网格在某处悬空。我可以使用 Ext.getCmp 访问网格,并且 grid.rendered
是正确的,但未显示。所以我想我必须在重新呈现该行后重新附加网格。
我想我可以附加到更新事件,并使用
找出是否在没有子网格的情况下重新渲染了 rowTpl
if(!grid.container.contains(grid.el))
但是有没有办法把网格放回dom?
我试过了
grid.container.insertFirst(grid.el);
但这不起作用。插入了元素,但没有显示网格。
有什么想法吗?
你这样做会导致内存泄漏(因为当网格 re-render 时你的组件没有被销毁)。
我建议查看:组件模板 (http://skirtlesden.com/ux/ctemplate) or if you try to render a nested grid, there was several attempt to build something correct and I think a working one is the following : http://blogs.walkingtree.in/2015/06/30/nested-grid-in-sencha-ext-js/
通过我的尝试,我已经走上了正确的轨道,错误完全在其他地方。问题是我重新附加的更新事件 fn 在破坏所有内容的更新事件 fn 之前执行,因为 fn 在同一事件上被触发并具有相同的优先级,但更早地附加到商店。更改优先级是一种选择,但我只是将创建放入 boxready 事件中,该事件在视图将其事件附加到商店后执行:
xtype:'grid',
listeners:{
boxready:function(grid) {
var store = grid.getStore();
...
store.on({
update:function(store, record) {
me.restoreSubgridDom(record);
},
beforeload:function(store) {
var records = store.getRange();
Ext.each(records,me.destroySubgrid);
}
});
}
}
具有两个功能:
restoreSubgridDom: function(record) {
var row = 'contact-row-' + record.get('Id'),
gridId = 'ContactRow'+record.get('Id')+'Grid',
grid = Ext.getCmp(gridId);
if(grid && !grid.container.contains(grid.el))
{
grid.container.insertFirst(grid.el);
}
},
destroySubgrid: function(record) {
var gridId = 'ContactRow'+record.get('Id')+'Grid',
grid = Ext.getCmp(gridId);
if(grid) grid.destroy();
}
我正在将组件渲染到网格中 rowExpander 插件 rowBodyTpl:
plugins: [{
ptype: 'rowexpander',
rowBodyTpl : [
'<div id="contact-row-{Id}"> </div>'
]
}],
var row = 'contact-row-' + record.get('Id'),
grid = Ext.getCmp(gridId),
if(!grid) me.createSubGrid(record,gridId).render(row);
这很好用。但是当网格接收到具有某些修改字段的记录的 update
事件时,该记录的 rowExpander 仅使用 rowTpl 重新呈现,并且内部网格在某处悬空。我可以使用 Ext.getCmp 访问网格,并且 grid.rendered
是正确的,但未显示。所以我想我必须在重新呈现该行后重新附加网格。
我想我可以附加到更新事件,并使用
找出是否在没有子网格的情况下重新渲染了 rowTplif(!grid.container.contains(grid.el))
但是有没有办法把网格放回dom?
我试过了
grid.container.insertFirst(grid.el);
但这不起作用。插入了元素,但没有显示网格。
有什么想法吗?
你这样做会导致内存泄漏(因为当网格 re-render 时你的组件没有被销毁)。
我建议查看:组件模板 (http://skirtlesden.com/ux/ctemplate) or if you try to render a nested grid, there was several attempt to build something correct and I think a working one is the following : http://blogs.walkingtree.in/2015/06/30/nested-grid-in-sencha-ext-js/
通过我的尝试,我已经走上了正确的轨道,错误完全在其他地方。问题是我重新附加的更新事件 fn 在破坏所有内容的更新事件 fn 之前执行,因为 fn 在同一事件上被触发并具有相同的优先级,但更早地附加到商店。更改优先级是一种选择,但我只是将创建放入 boxready 事件中,该事件在视图将其事件附加到商店后执行:
xtype:'grid',
listeners:{
boxready:function(grid) {
var store = grid.getStore();
...
store.on({
update:function(store, record) {
me.restoreSubgridDom(record);
},
beforeload:function(store) {
var records = store.getRange();
Ext.each(records,me.destroySubgrid);
}
});
}
}
具有两个功能:
restoreSubgridDom: function(record) {
var row = 'contact-row-' + record.get('Id'),
gridId = 'ContactRow'+record.get('Id')+'Grid',
grid = Ext.getCmp(gridId);
if(grid && !grid.container.contains(grid.el))
{
grid.container.insertFirst(grid.el);
}
},
destroySubgrid: function(record) {
var gridId = 'ContactRow'+record.get('Id')+'Grid',
grid = Ext.getCmp(gridId);
if(grid) grid.destroy();
}