我正在尝试使用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(),它也没有任何可见效果。
答案 0 :(得分:1)
加载器将是异步的 - 它需要等待服务器(MarketingService)返回值。你确定这会返回一个非空列表吗?通过用您自己的回调替换代理中的回调来验证这一点,该回调检查返回给客户端的内容(如果服务器引发异常,甚至可能根本不会调用它)。
如果在onRender上调用addMessage或此后不久,它可能为时过早,并且服务器可能尚未返回数据,因此存储可能仍为空。如果从按钮单击或其他东西调用,这将不是问题。
检查日志中的异常,您正在将处理项目列表的代理传递给需要ListLoadResult的Loader - 这也可能是错误的来源。 GXT 2中令人困惑的泛型应该主要在3中解决,目前处于测试阶段。