正直に言うと、RichFaces のポップアップ パネルは非常に扱いにくいものです。いくつかの JavaScript へのいくつかの呼び出しが含まれているため、一般的に機能するものを簡単に派生させることはできません。とにかく、私は次のことを試していました:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich">
<h:commandLink>
<h:graphicImage library="images/icons" name="#{buttonImageFileName}" />
<rich:tooltip value="#{buttonTooltipText}" direction="bottomRight" />
<rich:componentControl target="#{popupId}" operation="show" />
</h:commandLink>
<rich:popupPanel modal="true"
height="#{popupHeight}"
resizeable="#{popupResizable}"
onmaskclick="#{componentCallToId}.hide(); return false;"
id="#{popupId}">
<f:facet name="header">
<h:outputText value="#{popupHeaderText}" />
</f:facet>
<f:facet name="controls">
<h:outputLink value="#" onclick="#{componentCallToId}.hide(); return false;">
<h:outputText value="X" />
</h:outputLink>
</f:facet>
<p>#{popupSubject}</p>
<p>
<h:inputText value="#{inputTextBean[inputTextProperty]}" styleClass="full-width" id="#{inputTextId}" />
</p>
<h:panelGrid columns="2" style="margin: 0 auto;">
<h:commandButton value="OK"
action="#{acceptButtonBean[acceptButtonMethod](acceptButtonMethodArg)}"
onclick="#{componentCallToId}.hide(); return true;">
<a4j:ajax execute="@this #{inputTextId}" render="@form" />
</h:commandButton>
<h:commandButton value="Cancel" onclick="#{componentCallToId}.hide(); return false;" immediate="true" />
</h:panelGrid>
</rich:popupPanel>
</ui:composition>
これは、単純な入力ダイアログをポップアップする画像ボタンを表示します。これは、ポップアップの外側をクリックする (onmaskclick="...") か、右上隅のポップアップを X する ( with )ことによって非表示になるはずです。キャンセルを押します。OK では、AJAX フォームが送信され、ポップアップも非表示になります。しかし、何も起こりません (閉じることができません):<f:facet>
onclick="..."
<h:commandButton onclick="...">
EL式#{componentCallToId}.hide(); return false;
は上記の「問題児」です。そのようには機能していません。
オリジナルの非 Faceletsバリアント ( http://showcase.richfaces.org/richfaces/component-sample.jsf?demo=popup&sample=modalPopup&skin=classic ) では、コンポーネントを制御するための呼び出しは次のようになります。
<h:commandButton value="Cancel" onclick="#{rich:component('add-root-chapter-popup')}.hide(); return false;" immediate="true" />
次のパラメータを に渡します<ui:include>
。
<ui:include src="/subviews/add-node-clink-input-popup.xhtml">
<ui:param name="buttonImageFileName" value="add.png" />
...
<ui:param name="popupId" value="add-root-chapter-popup" />
<ui:param name="componentControlCallToId" value="rich:component('add-root-chapter-popup')" />
...
</ui:include>
長いエントリに注意してください (残りは機能しているようです - Bean + メソッド + arg の奇妙な構文でさえありますが、これはここでは焦点ではありません)。
Q:
なぜ機能しないの<ui:param name="componentControlCallToId" value="rich:component('add-root-chapter-popup')" />
ですか?現在、ポップアップの外側をクリックしたり、X を押したり、[OK] または [キャンセル] を押したりしても何も起こりません (ポップアップはそのままです)。
Firebug のみが表示されます:
syntax error
.hide(); return false;
式が null/空の文字列に評価されるようです。
どうしたの?修正できますか?私の代替手段は何ですか?
PS: 以前、Facelets 式で「popupId」を使用しようとしたことに注意してください。
<h:commandButton value="Cancel" onclick="#{rich:component('popupId')}.hide(); return false;" immediate="true" />
しかし、これは同じ結果になります。