Как уничтожить сетку ExtJS, не затрагивая ее хранилище? - PullRequest
0 голосов
/ 24 февраля 2010

У меня есть магазин 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 ]

1 голос
/ 07 января 2012

Я знаю, что это слишком поздно, но я все время уничтожаю сетки в ExtJS 4 (тоже 3), и хранилища сохраняются.

Я обнаружил, что если вы дадите хранилищу значение storeId, оно сохраняется (в ExtJS 3 оно длится до тех пор, пока не будет очищен DOM или не будет вызван Ext.StoreMgr.lookup (storeId) .destory ()). 1003 *

0 голосов
/ 26 февраля 2010

Я выяснил, в чем проблема.Существует ошибка с расширением Livegrid, которая портит основное хранилище, специфичное для livegrid, когда сетка закрыта.

0 голосов
/ 24 февраля 2010

В вашем магазине установите autoDestroy: false.

0 голосов
/ 25 февраля 2010

Смысл этого в том, что я хочу сохранить хранилище, чтобы сохранить сортировку и фильтрацию столбцов, но уничтожить сетку, чтобы сэкономить память.

Сохраняется ли внутренняя сортировка и фильтрация столбцов для объекта GridPanel или для объекта Store? Я не уверен, не копаясь в коде src. Это может быть вашей проблемой. Возможно, вам удастся «запомнить» сортировку / фильтр в куки (см. Ext.state.Manager).

Вы также можете попробовать просто скрыть сетку вместо того, чтобы удалить ее, как предложено Томми. Если у вас есть только одна сетка, использование памяти не должно быть слишком плохим.

Последнее, что нужно попробовать: на фабрике fn создайте сетку, а затем присоедините хранилище к ней, используя grid.store = dataStore;

0 голосов
/ 24 февраля 2010

Вы не указываете, как закрывать окно (вызывая метод close или закрывая окно из пользовательского интерфейса), но, возможно, вам следует вместо этого скрыть ? Цитирование документации ExtJS:

По умолчанию инструмент закрытия заголовка разрушает окно, в результате чего уничтожение любых дочерних компонентов. Это делает объект Window, и все его потомки непригодны. Включить повторное использование окна, используйте closeAction: 'Скрыть'.

А насчет опции конфигурации closeAction конкретно:

Этот параметр не влияет на закрытие метод, который всегда разрушит окно. Чтобы программно скрыть окно, вызовите скрыть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...