JSF:在单击外部时隐藏h:panelGroup

时间:2013-08-20 20:23:56

标签: jsf hide

我正在学习JSF 2。我想要实现的第一件事是以下场景:

我的页面上有一个commandLink。单击此链接时,将呈现h:panelGroup-Tag(取决于相应ManagedBean中的布尔属性 - 默认情况下为false)。我希望当再次点击“打开”panelGroup的链接时(那已经有效),不会呈现该panelGroup但我希望当用户点击该panelGroup外部时(不起作用)也不会呈现panelGroup

ManagedBean看起来像:

@ManagedBean
@SessionScoped
public class LocaleBean {

@PostConstruct
public void init(){
    locale = new Locale("de_DE");
    showLanguageDiv = false;
}

private boolean showLanguageDiv;

public boolean getShowLanguageDiv() {
    return showLanguageDiv;
}

public void setShowLanguageDiv(final boolean showLanguageDiv) {
    this.showLanguageDiv = showLanguageDiv;
}

public void switchShowDivStatus(ActionEvent e) {
    showLanguageDiv = !showLanguageDiv;
}

facelet看起来像:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
            xmlns:h="http://java.sun.com/jsf/html"
            xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core">
<h:form>
    <div>
        <h:commandLink style="float: right;padding: 2px" actionListener="#{localeBean.switchShowDivStatus}" value="#{msg.language}" >
        </h:commandLink>
    </div>
    <h:panelGroup rendered="#{localeBean.showLanguageDiv}" style="clear:both;float:right;border:2px;border-style: solid" >
        <p><h:commandButton .... /></p>
        <p><h:commandButton .... /></p>
        <p><h:commandButton .... /></p>
    </h:panelGroup>
</h:form>
</ui:composition>

我已经尝试添加一个通过javascript点击的隐藏链接(当用户点击正文中的任何位置时),它将ManagedBean的布尔属性设置为false,以便不渲染panelGroup。这部分起作用,因为panelGroup不再显示了。但另一方面,点击链接以显示panelGroup后再没有效果了。

它的外观如下:

<h:body onclick="document.getElementById('invisibleform:invisiblelink').click()">
    .
    .
    .
    <h:form id="invisibleform">
        <h:commandLink id="invisiblelink" actionListener="#{localeBean.switchShowDivStatus}"></h:commandLink>
    </h:form>
</h:body>

那么我该如何解决这个问题呢?这样做的最佳做法是什么?隐藏的链接是正确的方法吗?从我到目前为止所看到的,似乎这是应该通过javascript在客户端完成的事情。但我找到的所有解决方案都基于普通的html页面(非JSF),我无法想象在使用JSF时应该如何做。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

你能在JSF上使用Primefaces吗?有一个组件<p:overlayPanel> See here for the showcase。也许这对你有用......

相关问题