如何在不影响其商店的情况下销毁ExtJS网格?

时间:2010-02-24 04:55:51

标签: javascript extjs

我有一个像这样的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({...}),
        ...
    }
};

它完美无缺,除了我每次都有新店铺而不是重新使用旧店铺。

如何修复此问题以便我可以破坏网格而不会弄乱商店?这背后的想法是我想保留商店以保留列排序和过滤,但是为了节省内存而销毁网格。

5 个答案:

答案 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特定存储。