5

我正在尝试在通过ajax WebPage交换内容的a上实现面包屑导航。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);
    }
}

主页和页面Label很简单。每次我更新Panel. WebPage我确信这 target.add(breadCrumbContainer);条线会做到这一点。然而它是空的。标签什么也没显示。

我希望在写下这个问题时找到答案——这可能是显而易见的——但它仍然让我难以捉摸,所以我希望这里有人能发现我的错误。

4

1 回答 1

10

通过 Ajax 处理组件的可见性时setOutputMarkupPlaceholderTag(true)除了setOutputMarkupId(true). 之外,还需要使用. 请注意,这setOutputMarkupPlaceholderTag(true)将自动暗示setOutputMarkupId(true).

这样做的原因是,当组件通过 Ajax 刷新时(将其添加AjaxRequestTarget到 因此,要使替换接收到的标记的 JS 函数正常工作,必须引用要替换的 DOM 节点(一个 HTMLid属性)。这就是为什么setOutputMarkupId(true)需要。

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

于 2012-03-12T17:24:03.333 回答