我有一个像这样的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({...}),
...
}
};
它完美无缺,除了我每次都有新店铺而不是重新使用旧店铺。
如何修复此问题以便我可以破坏网格而不会弄乱商店?这背后的想法是我想保留商店以保留列排序和过滤,但是为了节省内存而销毁网格。
答案 0 :(得分:1)
我知道这已经很晚了,但是我在ExtJS 4中也一直摧毁网格(3也是如此)并保留了商店。
我发现如果你给store一个storeId值,它会被保留(在ExtJS 3中它会一直持续到DOM被清除或者调用Ext.StoreMgr.lookup(storeId).destory())。 / p>
答案 1 :(得分:0)
您没有指定关闭窗口的方式(通过调用close方法或从UI关闭窗口),但是您可能应该隐藏它?引用ExtJS文档:
默认情况下,关闭标头工具 破坏窗口导致的 破坏任何儿童组件。 这使得Window对象和所有 它的后代无法使用。启用 重用一个Window,使用closeAction: '隐藏'。
具体关于closeAction配置选项:
此设置不会影响关闭 永远会破坏的方法 窗口。以编程方式隐藏一个 窗口,呼叫隐藏。
答案 2 :(得分:0)
在您的商店中,设置autoDestroy: false
。
答案 3 :(得分:0)
这背后的想法是我想保留商店以保留列排序和过滤,但是为了节省内存而销毁网格。
是否对GridPanel
对象或Store
对象进行了内部排序和过滤?我不确定没有深入研究src代码。这可能是你的问题。也许你可以在cookie中“记住”排序/过滤器(参见Ext.state.Manager
)。
你也可以尝试隐藏网格而不是删除它,正如Tommi所建议的那样。如果你只有这一个网格,内存使用量不应该太差。
要尝试的最后一件事:在您的工厂fn中,创建网格,然后使用grid.store = dataStore;
答案 4 :(得分:0)
我发现了问题所在。 Livegrid扩展中存在一个错误,当网格关闭时,它会混淆底层的livegrid特定存储。