Ajax Wicket-如何正确重新加载/刷新可重用组件?
我有一个java类: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 {
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(接收方小组);
}
非常感谢您的帮助。您必须提供更多代码。如果您提交了正确的模型更改,请尝试:
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;
}