0

またはSupplyのいずれかになるオブジェクト があります(関連する質問を参照)。ElecSupplyGasSupply

どのサブクラスが編集されているかに関係なく、それらはすべて のリストを持っていますBillingPeriod

私は今BillingPeriodEditor、そのリストの内容に基づいて N 個の をインスタンス化する必要があり、どうすればよいのかかなり困惑しています。

私はGWTPを使用しています。SupplyEditorここに私がちょうど働いているのコードがあります:

public class SupplyEditor extends Composite implements ValueAwareEditor<Supply>
{
    private static SupplyEditorUiBinder uiBinder = GWT.create(SupplyEditorUiBinder.class);

    interface SupplyEditorUiBinder extends UiBinder<Widget, SupplyEditor>
    {
    }

    @Ignore
    final ElecSupplyEditor elecSupplyEditor = new ElecSupplyEditor();

    @Path("")
    final AbstractSubTypeEditor<Supply, ElecSupply, ElecSupplyEditor> elecSupplyEditorWrapper = new AbstractSubTypeEditor<Supply, ElecSupply, ElecSupplyEditor>(
            elecSupplyEditor)
    {
        @Override
        public void setValue(final Supply value)
        {
            setValue(value, value instanceof ElecSupply);
            if(!(value instanceof ElecSupply))
            {
                showGasFields();
            }
            else
            {
                showElecFields();
            }
        }
    };

    @Ignore
    final GasSupplyEditor gasSupplyEditor = new GasSupplyEditor();

    @Path("")
    final AbstractSubTypeEditor<Supply, GasSupply, GasSupplyEditor> gasSupplyEditorWrapper = new AbstractSubTypeEditor<Supply, GasSupply, GasSupplyEditor>(
            gasSupplyEditor)
    {
        @Override
        public void setValue(final Supply value)
        {
            setValue(value, value instanceof GasSupply);
            if(!(value instanceof GasSupply))
            {
                showElecFields();
            }
            else
            {
                showGasFields();
            }
        }
    };

    @UiField
    Panel elecPanel, gasPanel, unitSection;

    public SupplyEditor()
    {
        initWidget(uiBinder.createAndBindUi(this));

        gasPanel.add(gasSupplyEditor);
        elecPanel.add(elecSupplyEditor);
    }

    // functions to show and hide depending on which type...

    @Override
    public void setValue(Supply value)
    {
        if(value instanceof ElecSupply)
        {
            showElecFields();
        }
        else if(value instanceof GasSupply)
        {
            showGasFields();
        }
        else
        {
            showNeither();
        }
    }
}

さて、BillingPeriods のリストはサプライの一部であるため、これのロジックは SupplyEditor にあるはずです。

How to access PresenterWidget fields when added dynamicというスレッドで本当に良い助けを得ましたが、それはエディター フレームワークをまったく実装する前のことなので、ロジックが間違った場所にあると思います。

どんな助けでも大歓迎です。より多くのコード (Presenter と View) を投稿できますが、読みにくくしたくなかったので、データストアから Supply を取得し、View で edit() を呼び出すだけです。

ListEditor の例をいくつか見てきましたが、よくわかりません!

4

1 に答える 1

3

ListEditor が必要です

実際のビューでそれらをどのように表示するかによって異なりますが、同じ考え方が適用されます。

public class BillingPeriodListEditor implements isEditor<ListEditor<BillingPeriod,BillingPeriodEditor>>, HasRequestContext{
   private class BillingPeriodEditorSource extends EditorSource<BillingPeriodEditor>{
      @Override
      public EmailsItemEditor create(final int index) {
         // called each time u add or retrive new object on the list
         // of the @ManyToOne or @ManyToMany
      }
      @Override
      public void dispose(EmailsItemEditor subEditor) {
         // called each time you remove the object from the list
      }
      @Override
      public void setIndex(EmailsItemEditor editor, int index) {
         // i would suggest track the index of the subeditor. 
      }
   }

   private ListEditor<BillingPeriod, BillingPeriodEditor> listEditor = ListEditor.of(new BillingPeriodEditorSource ());

   // on add new one ...
   // apply or request factory 
   // you must implement the HasRequestContext to
   // call the create.(Proxy.class)
   public void createNewBillingPeriod(){
      // create a new one then add to the list
      listEditor.getList().add(...)
   }
}

public class BillingPeriodEditor implements Editor<BillingPeriod>{
    // edit you BillingPeriod object
}

次に、実際のエディターで、パスにあるように編集します Example getBillingPeriods();

BillingPeriodListEditor billingPeriods = new BillingPeriodListEditor ();


// latter on the clickhandler
billingPeriods.createNewBillingPeriod()

これで完了です。

于 2012-11-21T04:27:12.133 に答える