2012-01-12 4 views
1

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

Начальная загрузка данных грида (с помощью 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

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

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

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

+0

Погрузчик функционирует и заполняет сетку. Пока приложение не загрузилось, и Grid отображает существующие записи из MarketingService, которые я нажимаю на кнопку (test), которая, в свою очередь, вызывает вызов addMessage(). Поэтому я не могу себе представить, что это связано с тем, что вы только что упоминали. – uncrase

+0

Хорошо - было трудно сказать, что было предоставлено. Если в сетке видны элементы, то в хранилище все еще есть элементы (даже если вызов addMessage не видит элементов), что говорит о том, что, возможно, используется неправильный магазин - возможно, даже неправильный экземпляр MessageGrid. Легкий способ проверить - перейдите в addMessage и убедитесь, что this.grid.attached - true. Если это так, то каким-то образом вы либо торгуете сетками, либо хранилищами, либо нашли способ очистить сетку без внесения изменений. –

+0

Я только что проверил ... grid.attached показывается как ложный, переходя через метод addMessage(). – uncrase

Смежные вопросы