Wicket:ListView 中的下拉选项没有附加 onClick 行为
Wicket: Dropdown choice within ListView does not get onClick behaviour attached
基本问题描述:我正在尝试构建一个 ListView
(table),它会动态添加行。 table 中的每一行都包含一个 DropDownChoice
,并附有 'onchange' Ajax 行为。
我所看到的:table 中的第一个 DropDownChoice
行为正确。添加到 table 的任何其他内容都不会触发我的 Java 代码中的 onUpdate
方法。
我检查了 HTML,这是因为只有 table 中的第一个 DropDownChoice
附加了一个 onchange
处理程序。
这是我的 table 创建方法:-
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;
}
这是我的浏览器检查器的屏幕截图。您可以看到第二个 ListView
项没有 onchange
事件处理程序。但是我注意到第一个 ListView
项上有两个事件处理程序。
事实上,我只是添加了另一行,第一行的下拉列表中添加了另一个更改事件处理程序。为什么事件处理程序没有附加到正确的下拉列表?
我注意到两个
一般来说,不要在 HTML 中指定 id 属性,让 wicket 处理它,因为它确保 id 是唯一的。
基本问题描述:我正在尝试构建一个 ListView
(table),它会动态添加行。 table 中的每一行都包含一个 DropDownChoice
,并附有 'onchange' Ajax 行为。
我所看到的:table 中的第一个 DropDownChoice
行为正确。添加到 table 的任何其他内容都不会触发我的 Java 代码中的 onUpdate
方法。
我检查了 HTML,这是因为只有 table 中的第一个 DropDownChoice
附加了一个 onchange
处理程序。
这是我的 table 创建方法:-
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;
}
这是我的浏览器检查器的屏幕截图。您可以看到第二个 ListView
项没有 onchange
事件处理程序。但是我注意到第一个 ListView
项上有两个事件处理程序。
事实上,我只是添加了另一行,第一行的下拉列表中添加了另一个更改事件处理程序。为什么事件处理程序没有附加到正确的下拉列表?
我注意到两个
一般来说,不要在 HTML 中指定 id 属性,让 wicket 处理它,因为它确保 id 是唯一的。