繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM