GWT编辑器和GXT网格不发送新创建的代理实体,仅发送空值
有人能解决为什么我会通过包含ListStoreEditor子编辑器的GXT网格将空值保存到服务器实体上的OneToMany列表中的问题吗 我遵循了Sencha示例,GridBindings示例。 这将保存GWT编辑器捕获的所有数据元素。在我的数据库中,它确实在上面的代码中为网格创建了一行,但是所有的值都是null,因此当RequestContext激发时,persist会在网格中返回一个空行。因此,没有外键将OneToMany关系中的实体关联回其父实体 此外,我还查看了对服务器的JSON请求和响应,看起来实体中没有发送任何值。它可能是模糊的,但看起来其他值都是纯文本,所以我认为甚至没有传递代理实体值 任何帮助都会很好!谢谢GWT编辑器和GXT网格不发送新创建的代理实体,仅发送空值,gwt,gxt,gwt-editors,Gwt,Gxt,Gwt Editors,有人能解决为什么我会通过包含ListStoreEditor子编辑器的GXT网格将空值保存到服务器实体上的OneToMany列表中的问题吗 我遵循了Sencha示例,GridBindings示例。 这将保存GWT编辑器捕获的所有数据元素。在我的数据库中,它确实在上面的代码中为网格创建了一行,但是所有的值都是null,因此当RequestContext激发时,persist会在网格中返回一个空行。因此,没有外键将OneToMany关系中的实体关联回其父实体 此外,我还查看了对服务器的JSON请求和
driver.edit(entity);
store.add(driver.flush());
这些行表示“在编辑器中绘制新对象——好的,获取放入其中的任何值并将其添加到存储”。我不确定这是你想要的
稍后,您将引用一个编辑器或呈现程序
,但它似乎不在您的代码中,并且不清楚何时执行刷新(甚至是初步的编辑()
调用)并触发。您还制作了一个编辑器
,但该类型中没有允许编辑的子编辑器
在您链接到的示例中,混合中有两个不同的驱动程序。第一种方法是将整个列表传递到ListStore中,这实际上并不需要用于示例,但可以帮助解释如何将其与更大的案例(如示例)联系起来。这个例子应该被视为两个不同的编辑器,有两个不同的驱动程序——测试时更是如此。首先确保其中一个有效,并在driver.flush()之后返回正确的值,然后是另一个
从一开始,我认为在调用edit
之后立即调用driver.flush()
几乎肯定不是您想要的(因为驱动程序没有任何效果),因此从这里开始会很好。然后,如果这是您想要的,请测试当您在服务器上接收到调用时,您将获得模型对象及其所有值
这些行表示“在编辑器中绘制新对象——好的,获取放入其中的任何值并将其添加到存储”。我不确定这是你想要的
稍后,您将引用一个编辑器或呈现程序
,但它似乎不在您的代码中,并且不清楚何时执行刷新(甚至是初步的编辑()
调用)并触发。您还制作了一个编辑器
,但该类型中没有允许编辑的子编辑器
在您链接到的示例中,混合中有两个不同的驱动程序。第一种方法是将整个列表传递到ListStore中,这实际上并不需要用于示例,但可以帮助解释如何将其与更大的案例(如示例)联系起来。这个例子应该被视为两个不同的编辑器,有两个不同的驱动程序——测试时更是如此。首先确保其中一个有效,并在driver.flush()之后返回正确的值,然后是另一个
从一开始,我认为在调用
edit
之后立即调用driver.flush()
几乎肯定不是您想要的(因为驱动程序没有任何效果),因此从这里开始会很好。然后,如果这是您想要的,请测试当您在服务器上收到调用时,您将获得模型对象及其所有值。这花了我几天的时间,在科林的帮助下,在上面的评论中,谢谢
填充网格的原因是,当您在保存时刷新主编辑器时,值消失,并在网格中插入一个空行,因为您必须在编辑器上实现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;
}
}
公共类MyEditor实现IsWidget、编辑器、HasRequestContext{
接口绑定器扩展UiBinder{}
私有静态绑定器uiBinder=GWT.create(Binder.class);
私有上下文ctx;
私人列表商店;
ListStoreEditor项;
@忽略
@UiField(提供的=真)
网格;
@忽略
@尤菲尔德
儿童编辑儿童编辑;
@凌驾
公共小部件asWidget(){
MyProperties props=GWT.create(MyProperties.class);
this.store=newliststore(props.key());
列表列=新的ArrayList();
添加(新的ColumnConfig(props.itemName(),300,“MyColumn”);
this.grid=新网格(存储,新列模型(列));
items=新的ListStoreEditor(存储);
Widget Widget=uiBinder.createAndBindUi(这个);
初始化驱动程序(childEditor);
childEditor.getCreateButton().addSelectHandler(新的SelectHandler()){
@凌驾
选择公共无效(选择事件事件){
RequestContext=ctx.barRequest();
BarProxy实体=context.create(BarProxy.class);
实体名称(“Eugene Qtest”);
实体设置(45);
编辑(实体);
存储。添加(实体);
}
});
返回控件;
}
@凌驾
公共无效setRequestContext(RequestContext ctx){
this.ctx=ctx;
}
}
在科林的帮助下,我花了好几天才弄明白,谢谢
填充网格的原因是,当您在保存时刷新主编辑器时,值消失,并在网格中插入一个空行,因为您必须在编辑器上实现HasRequestContext接口以维护相同的RequestContext
driver.edit(entity);
store.add(driver.flush());
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;
}
}