当DateTextField被隐藏时,我如何隐藏DatePicker图标?



我用的是DatePicker (org.apache.wicket.extensions.yui.calendar.DatePicker —Javadoc)在表单中。表单由两个字段组成。第一个字段是一个下拉列表,第二个字段基于第一个字段动态更改。如果选择"text",则会出现一个文本框;如果选择"列表",则会出现下拉菜单;如果选择"date",则会出现日期选择器和相关字段。

下面是我当前代码的简化版本:

DateTextField dateField = new DateTextField("dateField", // ...
DatePicker datePicker = new DatePicker();
dateField.add(datePicker);
fieldOne.add(new OnChangeAjaxBehavior() {
    protected void onUpdate(AjaxRequestTarget target) {
        if (fieldOne.equalsIgnoreCase("list"))
        {
            dateField.setVisible(false);
            // datePicker.setVisible(false); // This line is impossible
            listField.setVisible(true);
            textField.setVisible(false);
        }
        else if { /* similar visibility settings for dates and text */ }
    }
});

表单目前可以正确地将更改为日期选择器。当选择了日期,然后用户选择了其他内容时,问题就出现了。日期字段消失,但是日期选择器仍然在屏幕上。不幸的是,它似乎没有一个setVisible()方法,或任何等效的。事实上,它甚至不是一个真正的Wicket Component

如何让它们同时出现/消失?如果我不能直接设置拾取器的可见性,我能否以某种方式将其与字段的可见性绑定?

到目前为止,最简单但仍然相当可维护的解决方案是将您想要隐藏在WebMarkupContainer中的组件分组在一起。在标记中,您可能希望为容器使用<div>元素,但这取决于您想要隐藏的内容。(有时标记本身会阻止您使用此方法,但希望您的标记不会。:))

然后更改容器的可见性

使用AjaxListeners的一个好主意也是在你想要处理的组件上调用.setOutputMarkupId(true)。否则你可能无法"定位"它。

如果你没有在加载时渲染它,但打算稍后添加组件,我认为你也应该调用setOutputMarkupPlaceholderTag(true)

最新更新