有没有人能解决为什么我会通过包含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编辑器捕获的所有数据元素。在我的数据库中,它确实在上面的代码中为网格创建了行,但所有值都为null,因此当RequestContext触发时,持久化程序会在网格中返回一个空行。因此,没有外键可以将OneToMany关系中的实体关联回其父实体。
此外,我已经查看了JSON请求和对服务器的响应,它看起来并不像实体中发送的任何值。它可能是混淆的,但看起来好像其他值都是纯文本,所以我认为代理实体值甚至不会被传递。
任何帮助都会很棒!感谢
答案 0 :(得分:1)
driver.edit(entity);
store.add(driver.flush());
这些行说“在编辑器中绘制新对象 - 好吧,取出放在那里的任何值并将其添加到商店”。我不确定这是你的意图。
稍后,您引用editorPresenter
,但这似乎不在您的代码中,并且您不清楚何时执行刷新(甚至是初步的edit()
调用)和火。您还可以创建Editor<BarProxy>
,但该类型中没有允许编辑的子编辑器。
在您链接的示例中,混合中有两个不同的驱动程序。第一个通过将它传递到ListStore来处理整个列表 - 为了一个例子,这实际上并不需要,但是有助于解释如何将它绑定到更大的案例中,例如{{3例子。这个例子应该被视为两个不同的编辑器,有两个不同的驱动程序 - 在测试时更是如此。首先确保一个工作,并在driver.flush()之后返回正确的值,然后返回另一个。
当我开始时,我认为在driver.flush()
调用之后立即调用edit
几乎肯定不是你想要的,(因为驱动程序没有任何效果),所以从那里开始会好的。然后,如果 是您想要的,那么在服务器上接收调用时测试一下,您将获得包含其所有值的模型对象。
答案 1 :(得分:0)
在上面的评论中,在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;
}
}