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. 在页面中,我使用可重用的 CompanyPanel。

    ...
    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. 将根据下拉菜单正确设置 TextFields(位于 companyPanel 内)
  3. 我修改了一个文本字段(属于一家公司)
  4. 我提交表格
  5. 我从下拉列表中更改公司
  6. 我改回第一家公司-> 问题:修改后的文本字段仍然显示里面修改后的文本。它没有重置为默认值。

非常感谢任何帮助。

4

2 回答 2

3

当然,它们会显示修改后的值。在 CompanyPanel 构造函数中创建公司列表。当您修改公司的数据时,会在该列表中修改对象。

解决此问题的一种快速方法是在 onSubmit 方法中将 CompanyPanel 面板替换为 CompanyPanel 的新实例。这将使用您的默认值重新创建公司列表。您当然会丢失修改后的值。

另一个可能更好的解决方法是将公司列表创建移动到可加载的可拆卸模型中:

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;
}

这样,每个请求都会使用默认值重新创建公司列表。

确保您在 Company 中实现了正确的 equals() 和 hashCode() 方法,但 DropDownChoice 可以显示正确的选定元素 - 因为在这种情况下,模型中的对象和列表中的对象可能永远不会是 ==。

于 2013-01-31T17:40:19.310 回答
-1

您必须提供更多代码。如果您提交正确以便模型更改尝试:

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