1

ListStoreEditorサブエディターを含むGXTグリッドを介してサーバーエンティティのOneToManyリストにnullを保存する理由を誰かが解決できますか?

私は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が起動すると、persistはグリッド内に空の行を戻します。したがって、OneToMany関係のエンティティをその親エンティティに関連付けるための外部キーはありません。

また、サーバーへのJSONリクエストとレスポンスを確認しましたが、エンティティで値が送信されていないようです。難読化されているかもしれませんが、他の値はプレーンテキストのように見えるので、プロキシエンティティの値が渡されているとは思えません。

どんな助けでも素晴らしいでしょう!ありがとう

4

2 に答える 2

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

これらの行は、「エディターで新しいオブジェクトを描画します。そこに入力された値を取得して、ストアに追加します」と言っています。これがあなたの意図したものかどうかはわかりません。

後で、を参照editorPresenterしますが、それはコードに含まれていないようです。また、フラッシュ(または予備edit()呼び出し)を実行して起動するタイミングが明確ではありません。も作成しますEditor<BarProxy>が、そのタイプには編集を許可するサブエディターはありません。

リンク先の例では、2つの異なるドライバーが混在しています。1つ目は、リストをListStoreに渡すことで、リスト全体を処理します。これは、例として実際には必要ありませんが、http:/のようなより大きなケースにこれを結び付ける方法を説明するのに役立ちます。 /www.sencha.com/examples/#ExamplePlace:listpropertybindingの例。この例は、実際には2つの異なるドライバーを使用する、2つの異なるエディターとして扱う必要があります。テスト時には2倍になります。まず、一方が機能することを確認し、driver.flush()の後に正しい値を返し、次にもう一方を返します。

私が始めたように、呼び出しのdriver.flush()直後のedit呼び出しは、ほぼ確実にあなたが望むものではないと思います(ドライバーは効果がなかったので)ので、そこから始めるのは良いことです。次に、それが必要な場合は、サーバーで呼び出しを受信したときに、すべての値を含むモデルオブジェクトを取得していることをテストします。

于 2012-10-30T17:43:31.780 に答える
0

上記のコメントのコリンの助けを借りて、これを理解するのに何日もかかりました、ありがとう!

グリッドにデータが入力されていた理由ですが、保存時にメインエディターをフラッシュすると、値が消えて空白の行がグリッドに挿入されました。これは、同じRequestContextセッションを維持するためにエディターにHasRequestContextインターフェイスを実装する必要があるためです。以下は私の修正されたコードです。

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 に答える