我正在尝试在通过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
行会这样做。但它是空的。标签什么都没有显示。
我希望在写这个问题时找到答案 - 这可能是显而易见的 - 但它仍然没有找到我,所以我希望有人在这里发现我的错误。
答案 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
属性。