我在表单中使用DatePicker
(org.apache.wicket.extensions.yui.calendar.DatePicker
- Javadoc)。表单由两个字段组成。第一个字段是下拉列表,第二个字段根据第一个字段动态更改。如果选择“文本”,则会出现一个文本框;如果选择“列表”,则会出现一个下拉菜单;如果选择“日期”,则会出现日期选择器和相关字段。
以下是我当前代码的简化版本:
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
。
如何让它们一起出现/消失?如果我无法直接设置选择器的可见性,我可以将其与场的可见性联系起来吗?
答案 0 :(得分:1)
到目前为止,最简单但仍然相当可维护的解决方案是将要隐藏的组件分组到WebMarkupContainer
中。在标记中,您可能希望对容器使用<div>
元素,但这取决于您要隐藏的内容。 (有时标记本身会阻止您使用此方法,但我们希望您的标记不会。:))
然后只需更改容器的可见性。
答案 1 :(得分:0)
使用AjaxListeners的一个好主意是在要处理的Component上调用.setOutputMarkupId(true)
。否则你可能无法“找到”它。
如果你没有在加载时渲染它,但打算稍后添加该组件,我认为你也应该调用setOutputMarkupPlaceholderTag(true)
。
这对我有好几次帮助......