And*_*den 2 java ajax wicket wicket-6
基本问题描述:我正在尝试构建一个ListView(表),它动态添加行。表中的每一行都包含一个DropDownChoice,并附有“onchange”Ajax 行为。
我所看到的:DropDownChoice表中的第一个行为正确。添加到表中的任何其他内容都不会触发onUpdate我的 Java 代码中的方法。
我检查了 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;
}
Run Code Online (Sandbox Code Playgroud)
这是我的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;
}
Run Code Online (Sandbox Code Playgroud)
这是我的浏览器检查器的屏幕截图。onchange您可以看到第二项没有事件处理程序ListView。但是我注意到第一个项目有两个事件处理程序ListView。事实上,我刚刚添加了另一行,第一行的下拉列表添加了另一个更改事件处理程序。为什么事件处理程序没有附加到正确的下拉列表?
我注意到两个 <select> 具有相同的 id 但名称不同。难道 onchange 处理程序会附加到 id,因此仅适用于第一个组件?
一般来说,不要在 HTML 中指定 id 属性,让 wicket 处理它,因为它确保 id 是唯一的。