基本问题描述:我正在尝试构建一个动态添加行的ListView
(表)。表中的每一行都包含DropDownChoice
,并附加了“onchange”Ajax行为。
我所看到的:表格中的第一个DropDownChoice
表现正常。添加到表中的任何其他内容都不会在我的Java代码中触发onUpdate
方法。
我已经检查了HTML,这种情况正在发生,因为只有表中的第一个DropDownChoice
附加了onchange
处理程序。
这是我的表创建方法: -
private WebMarkupContainer createCommandTable() {
commandTable = new WebMarkupContainer("commandTable");
commandView = new ListView<CommandModel>("commandRow", new PropertyModel<List<CommandModel>>(this, "commandListModels")) {
private static final long serialVersionUID = 6376139649874160166L;
@Override
protected void populateItem(ListItem<CommandModel> item) {
final CommandModel model = item.getModelObject();
item.add(createCommandDropdown(model));
item.add(createParameterTable(model));
item.add(createDeleteLink(model));
}
};
commandTable.add(commandView);
commandTable.setOutputMarkupId(true);
return commandTable;
}
这是我的DropDownChoice
创建方法: -
private DropDownChoice<Root.Command> createCommandDropdown(CommandModel model) {
IChoiceRenderer<Command> renderer = new ChoiceRenderer<Command>("name");
DropDownChoice<Root.Command> commandDropdown = new DropDownChoice<Root.Command>("commands", new PropertyModel<Root.Command>(model, "selectedCommand"), root.getCommand(), renderer);
commandDropdown.add( new AjaxFormComponentUpdatingBehavior( "onchange" ) {
private static final long serialVersionUID = -7424498013668780417L;
@Override
protected void onUpdate( AjaxRequestTarget target ) {
target.add(commandTable);
}
} );
commandDropdown.setNullValid(false);
commandDropdown.setOutputMarkupId(true);
return commandDropdown;
}
这是我浏览器检查员的屏幕截图。您可以看到第二个onchange
项目没有ListView
事件处理程序。但是我注意到第一个ListView
项上有两个事件处理程序。
实际上,我刚添加了另一行,第一行的下拉列表中添加了另一个更改事件处理程序。为什么事件处理程序没有附加到正确的下拉列表?
答案 0 :(得分:4)
我注意到两个&lt; select&gt;具有相同的ID但名称不同。可能是onchange处理程序附加到id,因此只能在第一个组件上工作吗?
一般情况下,不要在HTML中指定id属性,让wicket处理它,因为它确保id是唯一的。