我有一个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);

}



问题:公司面板没有重新显示。我真的不知道为什么。

工作流程:


我从下拉面板中选择一家公司
根据下拉列表,正确设置了TextField(位于companyPanel内部)
我修改了textField(属于公司)
我提交表格
我从下拉列表中更改公司
我回到第一家公司->问题:修改后的文本字段仍在其中显示修改后的文本。尚未重置为默认值。


任何帮助非常感谢。

最佳答案

当然,它们将显示修改后的值。您在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显示正确的所选元素-因为在这种情况下,模型中的对象和列表中的对象可能永远不会==。

关于ajax - Wicket-如何正确重新加载/刷新可重复使用的组件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14586432/

10-10 21:52