Я открыт для другого способа сделать это, но то, что у меня есть, похоже, должно работать из документации для RichFaces4 и JSF2.
Пользовательский поток выглядит так:
- 1) Существует ссылка на документ «Извлечь», реализованная с помощью h: outputLink
- 2) Пользователь щелкает его и получает диалоговое окно с просьбой ввести комментарии для проверки, реализованные с помощью rich: popupPanel
- 3) Пользователь вводит комментарии и нажимает кнопку «Продолжить» на панели rich: popupPanel, реализованной с помощью h: link (пробовал также h: commandLink и a4j: commandLink)
- 4) Появляется новое окно с содержимым, для которого установлен атрибут результата h: link
В моем случае все работает, кроме случаев, когда я передаю параметр из h: link
с a4j: param, атрибут значения которого не разрешает 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 и указав ее нажатие на тот же идентификатор элемента, он действительно предупредил меня о том, что он набрал.
Когда я останавливаюсь на стороне сервера, видовой метод myController.setCheckOutComment (String s), ему передается строка "document.getElementById ('myForm: dataTable: 0: commentsId'). Value"
Согласно документации РФ4:
Тег a4j: param может использоваться с компонентами, отличными от Ajax, в дополнение к компонентам Ajax. Это включает в себя компоненты, которые работают через запрос GET, такие как h: link
и
Для атрибута value могут использоваться переменные из функций JavaScript. В такой реализации атрибут noEscape должен быть установлен в true. При использовании noEscape = "true" атрибут value может содержать любое выражение JavaScript или вызов функции JavaScript, и результат будет отправлен на сервер в качестве атрибута value.
Поскольку я, кажется, играю по правилам jsf / rf4, я подумал, что это будет хорошо.
Стоит отметить, что если я использую a4j: commandLink вместо h: link, это действительно так
отправьте результат оценки JavaScript, однако, это нарушает открытие в его собственном окне
и несколько других вопросов.
Есть мысли о том, что может происходить, или даже лучший способ сделать это?