Wicket标签未更新/仍然不可见

时间:2012-03-12 11:07:02

标签: java wicket wicket-1.5

我正在尝试在通过ajax交换内容WebPage的{​​{1}}上实施面包屑导航。

最终看起来像这样: Panel

这是我的页面代码:

Home >> Page >> Panel

Home和Page public MyPage() { super(); contentContainer = new WebMarkupContainer("contentContainer"); contentContainer.setOutputMarkupId(true); add(contentContainer); contentContainer.add(content = createContentPanel()); breadCrumbContainer = new WebMarkupContainer("breadcrumbContainer"); breadCrumbContainer.setOutputMarkupId(true); add(breadCrumbContainer); final AjaxLink panelLink = new AjaxLink("panelLink") { @Override public void onClick(final AjaxRequestTarget target) { replaceContentPanel(getOverviewPanel(), target); } @Override public boolean isVisible() { return !(content instanceof OverviewPanel); } }; breadCrumbContainer.add(panelLink); panelLink.add(new Label("panelLabel", new Model<String>() { @Override public String getObject() { //some dynamic content for example: return contentPanel.getClass().getName(); } })); } public void replaceContentPanel(final Component replacer, final AjaxRequestTarget target) { content.replaceWith(replacer); content = replacer; if (target != null) { target.add(contentContainer); target.add(breadCrumbContainer); } } 很简单。每当我更新Label的内容Panel时,都需要更新Panel。我确信WebPage行会这样做。但它是空的。标签什么都没有显示。

我希望在写这个问题时找到答案 - 这可能是显而易见的 - 但它仍然没有找到我,所以我希望有人在这里发现我的错误。

1 个答案:

答案 0 :(得分:10)

通过Ajax播放组件的可见性时,除了setOutputMarkupId(true) 之外,还必须使用setOutputMarkupPlaceholderTag(true)。请注意,setOutputMarkupPlaceholderTag(true)会自动暗示setOutputMarkupId(true)

这样做的原因是当组件通过Ajax刷新(将其添加到AjaxRequestTarget)时,Wicket会在Ajax响应中返回刷新的标记,以便通过JS-DOM API替换它通过Ajax回调方法。因此,对于将替换接收到的标记工作的JS函数,必须引用要替换的DOM节点(HTML id属性)。这就是为什么需要setOutputMarkupId(true)的原因。

当更改可见性时,如果组件不可见,Wicket将不会为组件生成任何标记,这很好,但有一个缺点。如果一个不可见的组件在随后的ajax请求中可见,则它的标记将在Ajax响应中有效返回。但是,由于组件不可见,它甚至不会存在于原始标记中,并且在回调时不可能替换DOM节点。这就是setOutputMarkupPlaceholderTag(true)方法开始行动的地方,将可能不可见的组件包装在占位符标记(即<div>)中,该标记将始终以正确的方式呈现HTML id属性。