私は現在JSF 2を学んでいます。私が最初に実現したいことの 1 つは、次のシナリオです。
ページに 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;
}
フェイスレットは次のようになります。
<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を介してクリックされた非表示のリンクを追加しようとしました(ユーザーが本文のどこかをクリックしたとき)。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 を使用するときにこれをどのように行うべきかを想像することはできません。
アドバイスをありがとう。