Java 导叶标签未更新/不可见
我试图在Java 导叶标签未更新/不可见,java,wicket,wicket-1.5,Java,Wicket,Wicket 1.5,我试图在网页上实现面包屑导航,该网页通过ajax交换内容面板 结果是这样的: 主页>>页面>>面板 这是我的页面代码: public MyPage() { super(); contentContainer = new WebMarkupContainer("contentContainer"); contentContainer.setOutputMarkupId(true); add(contentContainer); contentContaine
网页上实现面包屑导航,该网页通过ajax交换内容面板
结果是这样的:
主页>>页面>>面板
这是我的页面代码:
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);
}
}
publicMyPage(){
超级();
contentContainer=新的WebMarkupContainer(“contentContainer”);
setOutputMarkupId(true);
添加(contentContainer);
add(content=createContentPanel());
breadCrumbContainer=新的WebMarkupContainer(“breadCrumbContainer”);
breadCrumbContainer.setOutputMarkupId(true);
添加(面包屑容器);
最终AjaxLink面板链接=新AjaxLink(“面板链接”){
@凌驾
public void onClick(最终AjaxRequestTarget目标){
replaceContentPanel(getOverviewPanel(),目标);
}
@凌驾
公共布尔值可见(){
返回!(概览面板的内容实例);
}
};
breadCrumbContainer.add(panelLink);
添加(新标签(“panelLabel”,新型号)(){
@凌驾
公共字符串getObject(){
//一些动态内容,例如:
返回contentPanel.getClass().getName();
}
}));
}
public void replaceContentPanel(最终组件替换器、最终AjaxRequestTarget目标){
内容。替换为(替换者);
内容=替代品;
如果(目标!=null){
添加(contentContainer);
添加(面包屑容器);
}
}
主页和页面标签
很简单。每次我更新网页
的面板
内容时,面板的内容都需要更新。我确信target.add(breadCrumbContainer)代码>行将执行此操作。然而,它是空的。标签上什么也没显示
我希望在写这个问题的时候能找到答案——这可能是显而易见的——但我仍然没有找到答案,所以我希望这里有人能发现我的错误 通过Ajax处理组件的可见性时,除了使用setOutputMarkupId(true)
之外,还必须使用。请注意,setOutputMarkupPlaceholderTag(true)
将自动暗示setOutputMarkupId(true)
这样做的原因是,当组件通过Ajax刷新时(将其添加到AjaxRequestTarget
),Wicket将在Ajax响应中返回刷新的标记,以便通过Ajax回调方法通过JS-DOM API替换它。因此,对于将替换接收到的标记的JS函数来说,有必要对要替换的DOM节点进行引用(一个HTMLid
属性)。这就是为什么需要setOutputMarkupId(true)
更改可见性时,如果组件不可见,Wicket将不会为组件生成任何标记,这很好,但有一个缺点。如果一个不可见的组件在下面的ajax请求中是可见的,那么它的标记将在ajax响应中有效地返回。但是,由于该组件不可见,它甚至不存在于原始标记中,并且不可能在回调时替换DOM节点。这就是setOutputMarkupPlaceholderTag(true)
方法开始工作的地方,它将可能不可见的组件包装在占位符标记(即
)中,占位符标记将始终使用正确的HTMLid
属性呈现 我想知道,为什么不使用wicket面包屑组件。查看wicketstuff页面上的一个示例:这是一个好主意,我将对此进行研究。但是我仍然想知道为什么标签没有显示?如果这确实是问题所在,那么在执行回调方法的过程中,您应该在文档中得到一个javascript错误。getElementById(id)
,因为id
在DOM中不存在。Xavi López是正确的,但您不需要设置setOutputMarkupPlaceholderTag(true)除了setOutputMarkupId(true)之外。仅仅第一个就足够了,因为它也会使第二个变为现实。很遗憾,你的问题不是解决方案,但是我学到了一些东西,这总是一件好事。我发现即使在不使用可见性的情况下,标签也不会显示。所以我搞砸了一些不同的事情。