Как добавить строки в сетку GXT - PullRequest
1 голос
/ 13 января 2012

Я пытаюсь создать довольно простое приложение GWT с использованием среды GXT, и я делаю это на основе электронной книги «Руководство для начинающих Ext GWT 2.0». В нем подробно описаны все этапы создания приложения с использованием модели GXT MVC, и большинство из них работает должным образом, однако я не могу - на протяжении всего срока службы - добавлять новые строки в свою таблицу.

Первоначальная загрузка данных таблицы (через itemStore, загрузчик и RPCProxy работает правильно).

Однако каждый раз, когда я запускаю событие, которое инициирует добавление новой строки, ListStore, к которому я хочу добавить, пуст (не нулевой! Но пустой) - даже если моя сетка показывает данные после начальной загрузки!

Вот некоторые из соответствующих кодов:

public class MessageGrid extends LayoutContainer {
    private final Grid<ModelData> grid;
    private final ListLoader<ListLoadResult<MarketingMessage>> loader;
    private final ListStore<ModelData> itemStore;
    public MessageGrid() {
        setLayout(new FitLayout());
        final MarketingServiceAsync marketingService = Registry.get(MarketingUIConstants.MARKETING_SERVICE);
        RpcProxy<List<MarketingMessage>> proxy = new RpcProxy<List<MarketingMessage>>() {
            @Override
            protected void load(Object loadConfig, final AsyncCallback<List<MarketingMessage>> callback) {
                marketingService.getMessages(callback);
            }
        };
        final List<ColumnConfig> columns = new ArrayList<ColumnConfig>();
        columns.add(new ColumnConfig("col1", "Name", 100));
        columns.add(new ColumnConfig("col2", "Phone", 100));
        final ColumnModel columnModel = new ColumnModel(columns);       
        loader = new BaseListLoader<ListLoadResult<MarketingMessage>>(proxy);
        itemStore = new ListStore<ModelData>(loader);
        grid = new Grid<ModelData>(itemStore, columnModel);
        grid.setBorders(true);
        grid.setAutoExpandColumn("sentTime");
        grid.setAutoHeight(false);
        grid.setHeight("100%");     
    }

    @Override
    protected void onRender(Element parent, int index) {
        super.onRender(parent, index);
        loader.load();
        add(grid);
    }

    public void addMessage(MarketingMessage marketingMessage) {
        itemStore.add(new MarketingMessage("test", "test")));
    }
}

addMessage () вызывается владельцем компонента (представление, в которое был добавлен этот LayoutContainer).

Если я установлю точку останова внутри метода addMessage (), мой itemStore будет иметь размер 0 (то же самое относится и к grid.getStore ()).

Я пробовал различные изменения в этом коде, и мне еще предстоит увидеть добавляемую строку.

По аналогичному примечанию: если внутри метода addMessage () я пытаюсь выполнить перезагрузку с прокси-сервера, поскольку я также обновляю данные на стороне сервера - т.е. loader.load (), он также не имеет видимого эффекта.

1 Ответ

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

Загрузчик будет асинхронным - ему нужно дождаться, пока сервер (MarketingService) вернет значения. Вы уверены, что это возвращает непустой список? Проверьте это, заменив обратный вызов в вашем прокси своим собственным обратным вызовом, который проверяет содержимое, возвращаемое клиенту (он может вообще не вызываться, если сервер выдал исключение).

Если addMessage вызывается onRender или вскоре после этого, это может быть слишком рано, и сервер, возможно, еще не возвратил данные, поэтому хранилище все еще может быть пустым. Если вызов вызывается нажатием кнопки или чем-то еще, это не будет проблемой.

Проверьте ваш журнал на наличие исключений, вы передаете Proxy, который обрабатывает список элементов, загрузчику, который ожидает ListLoadResult - это также может быть источником ошибок. Запутанные дженерики в GXT 2 в основном должны быть решены в 3, который в настоящее время находится в бета-версии.

...