Yas*_*ima 5 java wicket wicket-1.5
我正在尝试实现通过ajax WebPage交换内容的Breadcrumb Navigation Panel.
最终看起来像这样:
Home >> Page >> Panel
这是我的页面代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
Home和Page Label很简单.每次更新内容时Panel,都需要更新Panel的内容WebPage.我确信这 target.add(breadCrumbContainer);条线要做到这一点.但它是空的.标签什么都没有显示.
我希望找到答案 - 这可能是显而易见的 - 在写这个问题时,但它仍然没有我,所以我希望有人在这里发现我的错误.
Xav*_*ica 10
通过Ajax播放组件的可见性时setOutputMarkupPlaceholderTag(true),除了使用setOutputMarkupId(true)之外,还需要使用它.请注意,这setOutputMarkupPlaceholderTag(true)将自动暗示setOutputMarkupId(true).
这样做的原因是当组件通过Ajax刷新(将其添加到AjaxRequestTarget)时,Wicket会在Ajax响应中返回刷新的标记,以便通过Ajax回调方法通过JS-DOM API替换它.因此,对于将替换接收到的标记工作的JS函数,必须引用要替换的DOM节点(HTML id属性).这就是为什么setOutputMarkupId(true)需要.
更改可见性时,如果组件不可见,Wicket将不会为组件生成任何标记,这很好,但有一个缺点.如果一个不可见的组件在随后的ajax请求中可见,则它的标记将在Ajax响应中有效返回.但是,由于组件不可见,它甚至不会存在于原始标记中,并且在回调时不可能替换DOM节点.这就是setOutputMarkupPlaceholderTag(true)方法进入行动的地方,将可能不可见的组件包装在占位符标记(即a <div>)中,该标记将始终使用正确的HTML id属性进行渲染.