Ajax Wicket-如何正确重新加载/刷新可重用组件?

Ajax Wicket-如何正确重新加载/刷新可重用组件?,ajax,refresh,wicket,panel,reusability,Ajax,Refresh,Wicket,Panel,Reusability,我有一个java类: public Task { private int id; private Company sender; private Company receiver; //Getter and Setter ... } 如您所见,我在task类中还有另外两个自定义类。例如,公司有地址和目录 我有一个公司面板,将在页面上使用。下面是面板中的一些代码 public class CompanyPanel extends Panel {

我有一个java类:

public Task {

    private int id;
    private Company sender;
    private Company receiver;

    //Getter and Setter
    ...
}
如您所见,我在task类中还有另外两个自定义类。例如,公司有地址和目录

  • 我有一个公司面板,将在页面上使用。下面是面板中的一些代码

    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);
        }
        });
      }
    }
    
  • 当我提交表格时,我会:

    public void onSubmit(AjaxRequestTarget target, Form<?> form) {
    
        //doSomething
        target.add(senderPanel);
        target.add(receiverPanel);
    
    }
    
    public void onSubmit(AjaxRequestTarget目标,表单){
    //剂量
    target.add(senderPanel);
    target.add(接收方小组);
    }
    
  • 问题是:公司的专家组没有被重新招标。我真的不知道为什么

    工作流程:

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

  • 非常感谢您的帮助。

    您必须提供更多代码。如果您提交了正确的模型更改,请尝试:

    senderPanel.modelChanged();
    receiverPanel.modelChanged();
    target.add(senderPanel);
    target.add(receiverPanel);
    

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

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

    另一个可能更好的修复方法是将公司列表创建移动到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;
    }
    
    final dropdownthoice companyList=新的dropdownthoice(“公司”,型号,
    新的LoadableDetachableModel(){
    @凌驾
    受保护的列表加载(){
    Listcompanies=newarraylist();
    公司1=新公司();
    //设置公司的默认预定义值,以便我可以从下拉列表中选择它并自动设置字段
    公司1.setFtpAdress(“address1.com”);
    公司1.setFtpDir(“/MusterDir/”);
    公司。增加(公司1);
    //另一家公司也是如此
    ...
    公司。增加(公司2);
    ...
    返回公司;
    }
    
    这样,在每次请求时都会使用默认值重新创建公司列表


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

    我看到您也将此面板添加到表单中。页面何时首次显示,然后您才能看到此面板?是否首先调用onSubmit方法?如果e是一个激活onError方法的验证器。你在CompanyPanel中做什么?@hudi是的,当页面加载时,我可以看到所有panels@NicktaronSubmit方法首先被调用,是的,当用户点击按钮时,这些调用是不需要的。谢谢。这很有效!顺便问一下,你怎么知道这种原理?你擅长Wi吗cket模型,还是仅仅是java经验?自2006年以来,我一直在wicket的几个主要项目上工作。掌握模型概念是学习过程的一部分。
    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;
    }