![](/img/trans.png)
[英]When I destroy an ExtJs grid object its kept in the initialconfig, causing a massive memory leak, how do I get rid of this initialconfig properly?
[英]How do I destroy an ExtJS grid without affecting its store?
我有一个这样的ExtJS商店:
var dataStore = new Ext.data.JsonStore({...});
我在工厂使用它来获取GridPanel:
function CreateGrid(config) {
return new Ext.grid.GridPanel({
store: dataStore,
...
})
};
现在,当我运行以下代码时:
new Ext.Window({
closable: true,
items: CreateGrid(),
}).show();
我第一次运行它,网格工作正常。 但是,如果我关闭窗口并重新打开另一个窗口,则无法再对列进行排序,也无法刷新商店。
我已经将问题精确地定位到了商店,以及销毁网格时发生的一切。 如果我改为将CreateGrid()
函数更改为此:
function CreateGrid(config) {
return new Ext.grid.GridPanel({
store: new Ext.data.JsonStore({...}),
...
}
};
它工作得很好,除了我每次要开一家新店而不是重新使用旧店。
如何解决此问题,以便可以在不破坏商店的情况下销毁网格? 这背后的想法是,我想保留存储以便保留列的排序和过滤,但是为了节省内存而破坏网格。
我知道这很晚了,但是我一直在ExtJS 4中破坏网格(也是3),并且保留了存储。
我发现的是,如果给存储一个storeId值,它将被保留(在ExtJS 3中,它持续到清除DOM或调用Ext.StoreMgr.lookup(storeId).destory()为止)。
您没有指定关闭窗口的方式(通过调用close方法或从UI关闭窗口),但是也许应该隐藏它呢? 引用ExtJS文档:
默认情况下,关闭头工具破坏Window,从而破坏所有子组件。 这将使Window对象及其所有后代无法使用。 要启用窗口重用,请使用closeAction:'hide'。
关于closeAction config选项:
此设置不会影响将始终破坏窗口的close方法。 要以编程方式隐藏窗口,请调用hide。
在您的商店中,设置autoDestroy: false
。
这背后的想法是,我想保留存储以便保留列的排序和过滤,但是为了节省内存而破坏网格。
列排序和过滤是保留在GridPanel
对象还是Store
对象上的? 我不确定是否不深入src代码。 这可能是您的问题。 也许您可以实现“记住” cookie中的排序/过滤器(请参阅Ext.state.Manager
)。
您还可以尝试隐藏网格而不是删除它,如Tommi所建议的那样。 如果只有一个网格,则内存使用情况应该不会太差。
尝试做的最后一件事:在工厂fn中,创建网格,然后使用grid.store = dataStore;
将商店附加到它grid.store = dataStore;
我发现了问题所在。 Livegrid扩展存在一个错误,当网格关闭时,该错误会使底层特定于livegrid的商店混乱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.