Wicket:ListView中的下拉选项没有附加onClick行为

时间:2015-11-25 11:09:06

标签: java ajax wicket wicket-6

基本问题描述:我正在尝试构建一个动态添加行的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项上有两个事件处理程序。 实际上,我刚添加了另一行,第一行的下拉列表中添加了另一个更改事件处理程序。为什么事件处理程序没有附加到正确的下拉列表?

enter image description here

1 个答案:

答案 0 :(得分:4)

我注意到两个&lt; select&gt;具有相同的ID但名称不同。可能是onchange处理程序附加到id,因此只能在第一个组件上工作吗?

一般情况下,不要在HTML中指定id属性,让wicket处理它,因为它确保id是唯一的。