【问题标题】:How to add rows to a GXT grid如何将行添加到 GXT 网格
【发布时间】:2012-01-12 21:29:20
【问题描述】:

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

Grid 数据的初始加载(通过 itemStore、loader 和 RPCProxy 工作正常)。

但是,每次我触发触发添加新行的事件时,我想要添加的 ListStore 都是空的(不是 null!而是空的)——即使我的 Grid 在初始加载后显示数据!

以下是一些相关代码:

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(),它没有任何可见的效果。

【问题讨论】:

    标签: java gwt grid gxt


    【解决方案1】:

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

    如果在 onRender 或之后不久调用 addMessage,可能为时过早,服务器可能还没有返回数据,所以存储可能仍然是空的。如果通过单击按钮或其他方式调用,这将不是问题。

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

    【讨论】:

    • 加载程序正在运行并填充网格。直到应用程序加载完毕,并且网格显示来自 MarketingService 的现有记录,我单击了一个(测试)按钮,这反过来又触发了对 addMessage() 的调用。所以我无法想象这与你刚才提到的有关。
    • 好的 - 从提供的内容很难分辨。如果网格有可见的项目,那么存储仍然有项目(即使 addMessage 调用没有看到任何项目),这表明可能正在使用错误的存储 - 甚至可能是错误的 MessageGrid 实例。验证的简单方法 - 进入 addMessage,并确保 this.grid.attached 为真。如果是这样,那么您已经以某种方式交换了网格、存储,或者找到了一种在不绘制更改的情况下清除网格的方法。
    • 我刚刚检查过... grid.attached 在逐步执行 addMessage() 方法时显示为 false。
    • 感谢您的反馈 Colin,您对“您要么交换了网格”的评论让我思考,然后我意识到当我在构造函数中设置断点时,它被击中了两次! :-) 所以这与围绕它的总体 MVC 模型初始化所有部分的方式有关,它以某种方式创建了 2 个网格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    相关资源
    最近更新 更多