我愿意以不同的方式做到这一点,但我所拥有的似乎应该从 RichFaces4 和 JSF2 的文档中工作。
用户流程是这样的:
- 1) 有一个使用 h:outputLink 实现的“签出”文档链接
- 2) 用户点击它并收到一个对话框提示输入使用rich:popupPanel 实现的签出评论
- 3) 用户输入评论并点击 Rich:popupPanel 上的“继续”按钮,使用 h:link 实现(也尝试了 h:commandLink 和 a4j:commandLink)
- 4) 弹出一个新窗口,内容设置为 h:link 结果属性
在我损坏的情况下,一切正常,除非我从 h:link 使用 a4j:param 传递参数,其 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
没有指向我在 textarea 中输入的内容,但是通过在 dlg 上放置另一个按钮并将其 onclick 指向相同的元素 id,它确实提醒我输入的内容。
当我在服务器端视图范围内的 myController.setCheckOutComment(String s) 方法上停止时,它会传递字符串“document.getElementById('myForm:dataTable:0:commentsId').value”
根据 RF4 文档:
除了 Ajax 组件之外,a4j:param 标记还可以与非 Ajax 组件一起使用。这包括通过 GET 请求工作的组件,例如 h:link
和
JavaScript 函数中的变量可用于 value 属性。在这样的实现中,noEscape 属性应该设置为 true。使用 noEscape="true",value 属性可以包含任何 JavaScript 表达式或 JavaScript 函数调用,结果将作为 value 属性发送到服务器。
由于我似乎是在按 jsf/rf4 规则玩,我认为这样就可以了。
需要注意的一点是,如果我使用 a4j:commandLink 而不是 h:link,它确实会发送 javascript 评估的结果,但是会破坏它自己的窗口中的打开和其他一些问题。
对可能发生的事情有什么想法,甚至是更好的方法吗?