私はJavaクラスを持っています:
public Task { private int id; private Company sender; private Company receiver; //Getter and Setter ... }
ご覧のとおり、タスク クラスには他に 2 つのカスタム クラスがあります。会社には、たとえばアドレスとディレクトリがあります。
ページで再利用可能な CompanyPanel があります。パネルからのコードを次に示します。
public class CompanyPanel extends Panel { protected List<Company> companies; public CompanyPanel(String id, IModel<Company> model) { super(id,new CompoundPropertyModel<Company>(model)); companies = new ArrayList<Company>(); Company company_1 = new Company(); //Setting default predefined values for the company, so I can select it from the dropdown and to set fields automatically company_1.setFtpAdress("adress1.com"); company_1.setFtpDir("/MusterDir/"); companies.add(company_1); //SAME for another company ... companies.add(comany_2); ... final DropDownChoice<Company> companyList = new DropDownChoice<Company>("companies", model, new LoadableDetachableModel<List<Company>>() { @Override protected List<Company> load() { return companies; } }){ protected boolean wantOnSelectionChangedNotifications() { return true; } }; add(companyList); final TextField<String> ftpAdress = new TextField<String>("ftpAdress"); ftpAdress.setOutputMarkupId(true); add(ftpAdress); final TextField<String> ftpDir = new TextField<String>("ftpDir"); ftpDir.setOutputMarkupId(true); add(ftpDir); //added Ajax to dropdown to update textfields automatically, based on selection of dropdown companyList.add(new AjaxFormComponentUpdatingBehavior("onchange") { @Override protected void onUpdate(AjaxRequestTarget target) { target.add(ftpAdress); target.add(ftpDir); } }); } }
ページでは、再利用可能な CompanyPanels を使用しています。
... CompanyPanel senderPanel = new CompanyPanel("senderPanel", new PropertyModel(task,"sender")); senderPanel.setOutputMarkupId(true); form.add(senderPanel); CompanyPanel receiverPanel = new CompanyPanel("receiverPanel", new PropertyModel(task,"receiver")); receiverPanel.setOutputMarkupId(true); form.add(receiverPanel); ...
フォームを送信すると、次のようになります。
public void onSubmit(AjaxRequestTarget target, Form<?> form) { //doSomething target.add(senderPanel); target.add(receiverPanel); }
問題: 会社のパネルが再レンダリングされません。そして、私はその理由を本当に知りません。
ワークフロー:
- ドロップダウン パネルから会社を選択します
- ドロップダウンに基づいて、(companyPanel 内にある) TextFields が正しく設定されます。
- (会社に属している) textField を変更します
- フォームを送信します
- ドロップダウン リストから会社を変更します
- 最初の会社に戻ります -> 問題: 変更されたテキスト フィールドには、変更されたテキストが表示されます。デフォルト値にリセットされませんでした。
どんな助けでも大歓迎です。