如何将行添加到GXT网格

时间:2012-01-12 21:29:20

标签: java gwt grid gxt

我正在尝试使用GXT框架创建一个相当简单的GWT应用程序,并且正在基于电子书“Ext GWT 2.0初学者指南”进行此操作。它详细介绍了使用GXTs MVC模型构建应用程序的所有步骤,其中大部分都按预期工作,但我不能 - 在其生命周期中 - 向我的网格添加新行。

Grid数据的初始加载(通过itemStore,loader和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 个答案:

答案 0 :(得分:1)

加载器将是异步的 - 它需要等待服务器(MarketingService)返回值。你确定这会返回一个非空列表吗?通过用您自己的回调替换代理中的回调来验证这一点,该回调检查返回给客户端的内容(如果服务器引发异常,甚至可能根本不会调用它)。

如果在onRender上调用addMessage或此后不久,它可能为时过早,并且服务器可能尚未返回数据,因此存储可能仍为空。如果从按钮单击或其他东西调用,这将不是问题。

检查日志中的异常,您正在将处理项目列表的代理传递给需要ListLoadResult的Loader - 这也可能是错误的来源。 GXT 2中令人困惑的泛型应该主要在3中解决,目前处于测试阶段。