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

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属性进行渲染.