1

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

任何帮助都会很棒!谢谢

4

2 回答 2

1
            driver.edit(entity);
            store.add(driver.flush());  

这些行是说“在编辑器中绘制新对象--好的,取其中放入的任何值并将其添加到商店”。我不确定这是你想要的。

稍后,您引用 an editorPresenter,但这似乎不在您的代码中,并且不清楚何时执行该刷新(甚至是初步edit()调用)并触发。您还制作了Editor<BarProxy>, 但该类型中没有允许编辑的子编辑器。

在您链接到的示例中,混合有两种不同的驱动程序。第一个通过将整个列表传递到 ListStore 来处理整个列表 - 这实际上并不是为了示例而需要的,但它可以帮助解释您如何将其绑定到更大的案例中,例如http:/ /www.sencha.com/examples/#ExamplePlace:listpropertybinding示例。该示例实际上应该被视为两个不同的编辑器,具有两个不同的驱动程序 - 在测试时更是如此。首先确保一个工作,并在 driver.flush() 之后返回正确的值,然后另一个。

正如我开始的那样,我认为您在调用后driver.flush()立即edit调用几乎可以肯定不是您想要的,(因为驱动程序将没有任何效果),所以从那里开始会很好。然后,如果这您想要的,请测试当您在服务器上收到调用时,您将获取模型对象及其所有值。

于 2012-10-30T17:43:31.780 回答
0

在上述评论中科林的帮助下,我花了几天时间才弄清楚,谢谢!

网格填充的原因,但是当您在保存时刷新主编辑器时,值消失并且在网格中插入了一个空白行,因为您必须在编辑器上实现 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;     
    }
}
于 2012-10-31T02:35:55.093 回答