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节点进行引用(一个HTML
id
属性)。这就是为什么需要
setOutputMarkupId(true)


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

我想知道,为什么不使用wicket面包屑组件。查看wicketstuff页面上的一个示例:这是一个好主意,我将对此进行研究。但是我仍然想知道为什么标签没有显示?如果这确实是问题所在,那么在执行回调方法的过程中,您应该在
文档中得到一个javascript错误。getElementById(id)
,因为
id
在DOM中不存在。Xavi López是正确的,但您不需要设置setOutputMarkupPlaceholderTag(true)除了setOutputMarkupId(true)之外。仅仅第一个就足够了,因为它也会使第二个变为现实。很遗憾,你的问题不是解决方案,但是我学到了一些东西,这总是一件好事。我发现即使在不使用可见性的情况下,标签也不会显示。所以我搞砸了一些不同的事情。