3
  1. 私はJavaクラスを持っています:

    public Task {
    
        private int id;
        private Company sender;
        private Company receiver;
    
        //Getter and Setter
        ...
    }
    

    ご覧のとおり、タスク クラスには他に 2 つのカスタム クラスがあります。会社には、たとえばアドレスとディレクトリがあります。

  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);
        }
        });
      }
    }
    
  3. ページでは、再利用可能な 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);
    ...
    
  4. フォームを送信すると、次のようになります。

    public void onSubmit(AjaxRequestTarget target, Form<?> form) {
    
        //doSomething
        target.add(senderPanel);
        target.add(receiverPanel);
    
    }
    

問題: 会社のパネルが再レンダリングされません。そして、私はその理由を本当に知りません。

ワークフロー:

  1. ドロップダウン パネルから会社を選択します
  2. ドロップダウンに基づいて、(companyPanel 内にある) TextFields が正しく設定されます。
  3. (会社に属している) textField を変更します
  4. フォームを送信します
  5. ドロップダウン リストから会社を変更します
  6. 最初の会社に戻ります -> 問題: 変更されたテキスト フィールドには、変更されたテキストが表示されます。デフォルト値にリセットされませんでした。

どんな助けでも大歓迎です。

4

2 に答える 2

3

もちろん、変更された値が表示されます。CompanyPanelコンストラクターで会社のリストを作成します。会社のデータを変更すると、オブジェクトはそのリスト内で変更されます。

これを修正する簡単な方法は、onSubmitメソッドでCompanyPanelパネルをCompanyPanelの新しいインスタンスに置き換えることです。これにより、デフォルト値で会社のリストが再作成されます。もちろん、変更した値は失われます。

もう1つのおそらくより良い修正は、会社リストの作成をloadabledetachablemodelに移動することです。

final DropDownChoice<Company> companyList = new DropDownChoice<Company>("companies", model,
    new LoadableDetachableModel<List<Company>>() {
@Override
protected List<Company> load() { 
    List<Company>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);
        ...

    return companies;
}

このようにして、会社のリストは、デフォルト値を使用してすべての要求で再作成されます。

DropDownChoiceが適切な選択された要素を表示するために、Companyに適切なequals()およびhashCode()メソッドを実装していることを確認してください。このシナリオでは、モデル内のオブジェクトとリスト内のオブジェクトが==になることはありません。

于 2013-01-31T17:40:19.310 に答える
-1

より多くのコードを提供する必要があります。モデルが変更されるように正しく送信した場合は、次を試してください。

senderPanel.modelChanged();
receiverPanel.modelChanged();
target.add(senderPanel);
target.add(receiverPanel);
于 2013-01-29T19:00:04.043 に答える