Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何销毁ExtJS网格而不影响其存储?_Javascript_Extjs - Fatal编程技术网

Javascript 如何销毁ExtJS网格而不影响其存储?

Javascript 如何销毁ExtJS网格而不影响其存储?,javascript,extjs,Javascript,Extjs,我有这样一个ExtJS商店: var dataStore = new Ext.data.JsonStore({...}); 我将它与工厂一起使用,以获得GridPanel: function CreateGrid(config) { return new Ext.grid.GridPanel({ store: dataStore, ... }) }; 现在,当我运行此代码时: new Ext.Window({ closable: tru

我有这样一个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({...}),
        ...
    }
};
它工作得非常好,除了我每次都要开一家新的商店,而不是重复使用旧的


如何解决此问题,以便在不破坏商店的情况下销毁网格?这背后的想法是,我想保留存储以保留列排序和筛选,但销毁网格以节省内存。

您没有指定如何关闭窗口(通过调用close方法或从UI关闭窗口),但也许您应该隐藏它?引用ExtJS文档:

默认情况下,“关闭页眉”工具 破坏窗口,导致 销毁任何子组件。 这将创建窗口对象,以及所有 它的后代无法使用。使能 重新使用窗口时,请使用closeAction: “隐藏”

特别是关于closeAction配置选项:

此设置不影响关闭 方法,它将始终破坏 窗户。以编程方式隐藏 窗口,调用隐藏


在商店中,设置
autoDestroy:false

这背后的想法是,我希望保留存储以保留列排序和筛选,但为了节省内存而破坏网格

列排序和筛选是在
GridPanel
对象内部保存,还是在
存储
对象内部保存?如果不深入研究src代码,我不确定。这可能是你的问题。也许您可以在cookie中实现“记住”排序/筛选(请参见
Ext.state.Manager

您也可以尝试隐藏网格,而不是像Tommi建议的那样删除它。如果您只有一个网格,内存使用应该不会太差


最后一件要尝试的事情:在工厂fn中,创建网格,然后使用
grid.store=dataStore将存储附加到它

我发现了问题所在。Livegrid扩展有一个bug,当网格关闭时,它会弄乱底层Livegrid特定的存储。

我知道这已经太晚了,但我一直在ExtJS 4(3)中破坏网格,存储被保留下来


我发现,如果你给一个存储一个storeId值,它就会被保留(在ExtJS3中,它会一直持续到DOM被清除或Ext.StoreMgr.lookup(storeId).destory()被调用为止)。

默认情况下它是false,我没有将它设置为true。哎呀,我使用
Window
只是作为一种简单的方法来测试这个问题。
GridPanel
实际上位于另一个
面板中,我正在使用
Panel.remove()
删除网格。