GWT 编辑器和 GXT 网格不发送新创建的代理实体,只有 NULL 值
Posted
技术标签:
【中文标题】GWT 编辑器和 GXT 网格不发送新创建的代理实体,只有 NULL 值【英文标题】:GWT Editor and GXT Grid Not Sending Newly Created Proxy Entities, Only NULL Values 【发布时间】:2012-10-30 13:49:31 【问题描述】:是否有人可以解决我为什么要通过包含 ListStoreEditor 子编辑器的 GXT 网格将空值保存到服务器实体上的 OneToMany 列表?
我已经按照 Sencha 示例 GridBindingExample 进行了操作。 http://www.sencha.com/examples/#ExamplePlace:gridbinding
public class MyEditor implements IsWidget, Editor<FooProxy>
interface Binder extends UiBinder<Widget, MyEditor>
private static Binder uiBinder = GWT.create(Binder.class);
public interface Driver extends SimpleBeanEditorDriver<MyProxy, MyEditor>
private Driver driver = GWT.create(Driver.class);
private ListStore<BarProxy> store;
ListStoreEditor<BarProxy> items;
@Ignore
@UiField(provided = true)
Grid<BarProxy> grid;
@Ignore
@UiField
ChildEditor childEditor;
@Override
public Widget asWidget()
MyProperties props = GWT.create(MyProperties.class);
this.store = new ListStore<BarProxy>(props.key());
List<ColumnConfig<BarProxy, ?>> columns = new ArrayList<ColumnConfig<BarProxy, ?>>();
columns.add(new ColumnConfig<BarProxy, String>(props.itemName(), 300, "MyColumn"));
this.grid = new Grid<BarProxy>(store,new ColumnModel<BarProxy>(columns));
items = new ListStoreEditor<BarProxy>(store);
Widget widget = uiBinder.createAndBindUi(this);
driver.initialize(childEditor);
childEditor.getCreateButton().addSelectHandler(new SelectHandler()
@Override
public void onSelect(SelectEvent event)
RequestContext context = factoryProvider.get().barRequest();
BarProxy entity = context.create(BarProxy.class);
entity.setName("Eugene Qtest");
entity.setAge(45);
driver.edit(entity);
store.add(driver.flush());
);
return widget;
public class ChildEditor implements IsWidget, Editor<BarProxy>
interface Binder extends UiBinder<Widget, ChildEditor>
private static Binder uiBinder = GWT.create(Binder.class);
@UiField
TextButton createButton;
@Override
public Widget asWidget()
return uiBinder.createAndBindUi(this);
public TextButton getCreateButton()
return createButton;
在我的代码中的上层演示者中,我正在调用:
RequestContext req = editorPresenter.getDriver().flush();
req.fire();
这确实保存了 GWT 编辑器捕获的所有数据元素。在我的数据库中,它确实在上面的代码中为网格创建了行,但是所有的值都是空的,所以当 RequestContext 触发时,持久化会在网格中返回一个空行。因此,没有外键可以将 OneToMany 关系中的实体关联回其父实体。
另外,我查看了对服务器的 JSON 请求和响应,看起来没有任何值正在实体中发送。它可能被混淆了,但它看起来好像其他值是纯文本,所以我认为代理实体值甚至没有被传递。
任何帮助都会很棒!谢谢
【问题讨论】:
【参考方案1】: driver.edit(entity);
store.add(driver.flush());
这些行的意思是“在编辑器中绘制新对象——好的,取其中放入的任何值并将其添加到存储中”。我不确定这是你想要的。
稍后,您引用了一个editorPresenter
,但这似乎不在您的代码中,并且不清楚您何时执行该刷新(甚至是初步的edit()
调用)并触发。您还创建了一个Editor<BarProxy>
,但该类型中没有允许编辑的子编辑器。
在您链接到的示例中,混合了两种不同的驱动程序。第一个通过将整个列表传递到 ListStore 来处理整个列表 - 出于示例的目的,这实际上并不是必需的,但可以帮助解释如何将其绑定到更大的案例中,例如 http://www.sencha.com/examples/#ExamplePlace:listpropertybinding例子。该示例实际上应该被视为两个不同的编辑器,具有两个不同的驱动程序 - 在测试时更是如此。首先确保一个工作,并在 driver.flush() 之后返回正确的值,然后另一个。
正如我开始的那样,我认为在edit
调用之后立即调用driver.flush()
几乎肯定不是你想要的,(因为驱动程序没有任何效果),所以从那里开始会很好。然后,如果 是您想要的,请测试当您在服务器上收到调用时,您将获得模型对象及其所有值。
【讨论】:
对不起 Colin,这是虚拟代码,因为真正的代码会占用太多空间。 模型种类是这样分解的。 1. MainModel - ChildOne * List在上述 cmets 的 Colin 的帮助下,我花了好几天才弄明白,谢谢!
网格填充的原因,但是当您在保存时刷新主编辑器时,值消失并且在网格中插入了一个空白行,因为您必须在编辑器上实现 HasRequestContext 接口以保持相同的 RequestContext会议。以下是我修改后的代码。
public class MyEditor implements IsWidget, Editor<FooProxy>, HasRequestContext<FooProxy>
interface Binder extends UiBinder<Widget, MyEditor>
private static Binder uiBinder = GWT.create(Binder.class);
private RequestContext ctx;
private ListStore<BarProxy> store;
ListStoreEditor<BarProxy> items;
@Ignore
@UiField(provided = true)
Grid<BarProxy> grid;
@Ignore
@UiField
ChildEditor childEditor;
@Override
public Widget asWidget()
MyProperties props = GWT.create(MyProperties.class);
this.store = new ListStore<BarProxy>(props.key());
List<ColumnConfig<BarProxy, ?>> columns = new ArrayList<ColumnConfig<BarProxy, ?>>();
columns.add(new ColumnConfig<BarProxy, String>(props.itemName(), 300, "MyColumn"));
this.grid = new Grid<BarProxy>(store,new ColumnModel<BarProxy>(columns));
items = new ListStoreEditor<BarProxy>(store);
Widget widget = uiBinder.createAndBindUi(this);
driver.initialize(childEditor);
childEditor.getCreateButton().addSelectHandler(new SelectHandler()
@Override
public void onSelect(SelectEvent event)
RequestContext context = ctx.barRequest();
BarProxy entity = context.create(BarProxy.class);
entity.setName("Eugene Qtest");
entity.setAge(45);
ctx.edit(entity);
store.add(entity);
);
return widget;
@Override
public void setRequestContext(RequestContext ctx)
this.ctx = ctx;
【讨论】:
以上是关于GWT 编辑器和 GXT 网格不发送新创建的代理实体,只有 NULL 值的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Swagger UI 添加到现有的 GXT 或 GWT 项目并使用当前的 GWT-RPC REST 请求?