私はこれを行う別の方法を受け入れていますが、私が持っているものは、RichFaces4 と JSF2 のドキュメントから機能するはずです。
ユーザー フローは次のようになります。
- 1) h:outputLink で実装された「チェックアウト」ドキュメント リンクがあります。
- 2) ユーザーがそれをクリックすると、rich:popupPanel で実装されたチェックアウト コメントを入力するダイアログが表示されます。
- 3) ユーザーはコメントを入力し、h:link で実装された rich:popupPanel の [続行] ボタンをクリックします (h:commandLink と a4j:commandLink も試しました)。
- 4) h:link 結果属性に設定されたコンテンツを含む新しいウィンドウがポップアップします。
私の壊れたケースでは、a4j:param を使用して h:link からパラメーターを渡す場合を除いて、すべてが機能します。その value 属性は、それが指す JavaScript を正しく解決しません。
<h:outputLink id="promptForCommentsLink"
onclick="#{rich:component('commentsDlg')}.show();return false;"
value="#"> Check Out </h:outputLink>
<rich:popupPanel id="commentsDlg" modal="true">
<h:inputTextarea id="commentsId"/>
<h:link id="continueLink"
outcome="editorPage" <!-- editor for making changes to document -->
target="_blank" <!-- open in it;s own indow -->
value="Continue Check Out"
onclick="#{rich:component('commentsDlg')}.hide();">
<!-- these params get assignd to backing bean properties -->
<a4j:param name="dataId"
value="#{ithRow.id}" assignTo="#{myController.dataId}"/>
<a4j:param name="checkedOut"
value="true" assignTo="#{myController.checkedOut}"/>
<!-- this one is broken. assigns chars 'document.getElementById('..
to #{myController.checkOutComment} -->
<a4j:param name="checkOutComment"
assignTo="#{myController.checkOutComment}"
noEscape="true"
value="document.getElementById('myForm:dataTable:0:commentsId').value"
/>
</h:link>
</rich:popupPanel>
もしかしてと思ってた
document.getElementById('myForm:dataTable:0:commentsId').value
私がテキストエリアに入力したものを指していませんでしたが、dlgに別のボタンを配置し、同じ要素IDをonclickで指すことで、入力したものを実際に警告してくれました.
サーバー側ビュー スコープの myController.setCheckOutComment(String s) メソッドで停止すると、文字列 "document.getElementById('myForm:dataTable:0:commentsId').value" が渡されます。
RF4 のドキュメントによると:
a4j:param タグは、Ajax コンポーネントだけでなく、非 Ajax コンポーネントでも使用できます。これには、h:link などの GET リクエストを介して動作するコンポーネントが含まれます。
と
JavaScript 関数の変数を value 属性に使用できます。このような実装では、noEscape 属性を true に設定する必要があります。noEscape="true" を使用すると、value 属性に任意の JavaScript 式または JavaScript 関数呼び出しを含めることができ、結果が value 属性としてサーバーに送信されます。
jsf/rf4のルールで遊んでいるようなので、これでいいと思いました。
h:link の代わりに a4j:commandLink を使用すると、評価された javascript の結果が実際に送信されますが、独自のウィンドウで開くことができず、他のいくつかの問題が発生します。
何が起こっているのか、またはこれを行うためのより良い方法について何か考えはありますか?