GWT编辑器和GXT网格不发送新创建的代理实体,仅NULL值

时间:2012-10-30 13:49:31

标签: gwt gxt gwt-editors

有没有人能解决为什么我会通过包含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请求和对服务器的响应,它看起来并不像实体中发送的任何值。它可能是混淆的,但看起来好像其他值都是纯文本,所以我认为代理实体值甚至不会被传递。

任何帮助都会很棒!感谢

2 个答案:

答案 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;     
    }
}