2012-01-12 121 views
1

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

Grid数据的初始加载(通过itemStore,loader和RPCProxy正常工作)。但是每次我触发添加新行的事件时,我想要添加的ListStore都是空的(不为空!但是为空) - 即使我的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(),它没有任何可见的效果。

回答

1

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

如果在onRender或稍后调用addMessage,则可能为时过早,并且服务器可能尚未返回数据,因此商店可能仍为空。如果从按钮点击或其他东西调用,这不会是一个问题。

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

+0

加载程序正在运行并填充网格。直到应用程序加载完毕,Grid才会显示MarketingService中的现有记录,然后单击(测试)按钮,然后触发addMessage()的调用。所以我无法想象这与你刚才提到的有关。 – uncrase 2012-01-12 22:37:00

+0

好的 - 很难从提供的内容中知道。如果网格中的项目可见,那么商店仍然有项目(即使addMessage调用没有看到任何项目),这表明可能正在使用错误的存储 - 甚至可能是MessageGrid的错误实例。简单的方法来验证 - 步入addMessage,并确保this.grid.attached是真实的。如果是这样,那么不管怎样,你都要交易网格,商店,或者找到了一种方法来清除网格而不用绘制更改。 – 2012-01-12 23:10:53

+0

我刚刚检查过... grid.attached在通过addMessage()方法时显示为false。 – uncrase 2012-01-12 23:24:20