0

一部のmodelObjectを親ページとして使用するパネルを取得するにはどうすればよいですか?

モデルとしてOwnedAccountを使用するフォームがあり、そのフォームには、financeAccountのリストを含むrefreshingviewを持つカスタムパネルがあります。問題は、financeaccountsへの変更がフォームのmodelobjectで変更されていないことです。

いくつかのコード、私は3つのドット「...」がある多くのコードを削除しました

@Entity
@Table(name = "ownedaccount")
public class OwnedAccount implements Serializable {

...

    //used for multiple currencies
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "ownedAccount")
    private List<FinanceAccount> financeAccounts = new ArrayList<FinanceAccount>();

...
}

public class AssetsPage extends LoggedInPage {

...

    // bookmarkable constructor
    public AssetsPage(PageParameters parameters) {
        super(parameters);

        init();
    }

    private void init() {
        final OwnedAccount ownedAccount = getCurrentSelections().getSelectedOwnedAccount();

        add(new FeedbackPanel("feedback"));

        entityEdit = new OwnedAccountForm("entityEdit", ownedAccount);
        add(entityEdit);

    }

    @Override
    protected void selectionsChanged() {
        OwnedAccount selectedOwnedAccount = getCurrentSelections().getSelectedOwnedAccount();
        CompoundPropertyModel<OwnedAccount> model = new CompoundPropertyModel<OwnedAccount>(selectedOwnedAccount);
        entityEdit.setModel(model);
    }

...

    class OwnedAccountForm extends BaseCreateEditForm<OwnedAccount, Void> {

...

        public OwnedAccountForm(String s, OwnedAccount entity) {
            super(s, entity, null);
            assetType = entity.getAssetType();
        }

        @Override
        protected void initComponents(Void initParams) {

  ...
            multipleCurrenciesPanel = new MultipleCurrenciesPanel("multipleCurrenciesPanel", ownedAccountService, getCurrentSelections());
            add(multipleCurrenciesPanel);

...

        }
...

}

    public class MultipleCurrenciesPanel extends Panel {

        OwnedAccountService ownedAccountService;
        CurrentSelections currentSelections;

        public MultipleCurrenciesPanel(String id, OwnedAccountService ownedAccountService, CurrentSelections currentSelections) {
            super(id);
            this.ownedAccountService = ownedAccountService;
            this.currentSelections = currentSelections;
            init();
        }

        private void init() {

            DepositoryLabel currencyLabel = new DepositoryLabel("currency", new ResourceModel("currency"));
            add(currencyLabel);

            DepositoryLabel accountForSecuritasLabel = new DepositoryLabel("account.for.securitas", new ResourceModel("account.for.securitas"));
            add(accountForSecuritasLabel);

            DepositoryLabel accountForCashLabel = new DepositoryLabel("account.for.cash", new ResourceModel("account.for.cash"));
            add(accountForCashLabel);

            DepositoryLabel buttonDeleteLabel = new DepositoryLabel("button.delete", new ResourceModel("button.delete"));
            add(buttonDeleteLabel);

            CurrenciesView currenciesView = new CurrenciesView("financeAccounts", ownedAccountService, currentSelections, this);
            add(currenciesView);

            setOutputMarkupId(true);
        }

    }

25/9-15:15更新

public class CurrenciesView extends RefreshingView<FinanceAccount> {


    private OwnedAccountService ownedAccountService;
    private CurrentSelections currentSelections;
    private WebMarkupContainer multipleCurrenciesForDepot;



    public CurrenciesView(String id, OwnedAccountService ownedAccountService, CurrentSelections currentSelections, WebMarkupContainer multipleCurrenciesForDepot) {
        super(id);
        this.ownedAccountService = ownedAccountService;
        this.currentSelections = currentSelections;
        this.multipleCurrenciesForDepot = multipleCurrenciesForDepot;
    }


    @Override
    protected Iterator getItemModels() {


        List<FinanceAccount> financeAccounts = ownedAccountService.getFinanceAccounts(currentSelections.getSelectedOwnedAccount());

        return new ModelIteratorAdapter<FinanceAccount>(financeAccounts.iterator()) {
            @Override
            protected IModel<FinanceAccount> model(FinanceAccount object) {
                return new CompoundPropertyModel<FinanceAccount>((object));
            }
        };
    }

    @Override
    protected void populateItem(Item<FinanceAccount> item) {

        final FinanceAccount financeAccount = item.getModelObject();
        item.add(new EnumDropDownChoice<MoneyCurrency>("forCurrency"));
        item.add(new TextField("accountNumber"));
        item.add(new OwnedAccountDropDownChoice("accountForCash", currentSelections.getSelectedLegalEntity().getOwnedBankAccounts()));
        item.add(new AjaxButton("deleteFinanceAccount") {
            @Override
            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                //TODO Delete finance account
                ownedAccountService.deleteFinanceAccount(currentSelections.getSelectedOwnedAccount(), financeAccount);
                target.add(multipleCurrenciesForDepot);
            }

            @Override
            protected void onError(AjaxRequestTarget target, Form<?> form) {
                //TODO create error message
            }
        });
    }


}
4

2 に答える 2

1

CurrentSelectionsは、2つの異なるウィケットページ/コンポーネントによって使用および変更されるかどうかをモデル化する必要があります。

たとえば、コンストラクター、新しいStringオブジェクト、およびStringオブジェクトをパラメーターとして使用するPanelを持つ親ページがあります。

public class ParentPage extends WebPage {

       public ParentPage() {

            String string = new String("Dave");
            add(new Panel("childPanel", string));
            string = new String("Brian");  
       }
}

パネルが追加された後に文字列オブジェクトが更新された場合、その更新された文字列はパネルにあるものではありません。ParentPageの文字列が「Brian」になっていると考えると、パネルには「Dave」があります。

ただし、モデルを作成して文字列オブジェクトを使用するようにした場合、文字列を変更すると、childPanelが更新を取得します。

public class ParentPage extends WebPage {

       public ParentPage() {

            String string = new String("Dave");
            IModel model = new Model(string);

            add(new Panel("childPanel", model));
            model.setObject(new String("Brian"));  
       }
}

非常に単純な例ですが、お役に立てば幸いです。

于 2012-09-25T13:53:30.857 に答える
0

コンストラクターで渡されたモデル参照をパネルに保存しましたが、これまでのところ正常に機能しています。

 BankAccountPanel bankAccountPanel = new BankAccountPanel("bankAccountPanel", getModel());
            add(bankAccountPanel);

..。

public class BankAccountPanel extends Panel {

    IModel<OwnedAccount> iModel;

    public BankAccountPanel(String id, IModel<OwnedAccount> model) {
        super(id, model);
        this.iModel = model;
        init();
    }
于 2012-09-28T06:54:27.467 に答える