0

我愿意以不同的方式做到这一点,但我所拥有的似乎应该从 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 评估的结果,但是会破坏它自己的窗口中的打开和其他一些问题。

对可能发生的事情有什么想法,甚至是更好的方法吗?

4

1 回答 1

0

您可以将 a4j:jsFunction 与您需要的参数一起使用。然后从 h:link 标记中的 onclick 调用该函数,例如 setParams(#{ithRow.id}, true)。问题仍然存在,您不能将值作为参数传递给 javascript 函数。您可以使用“执行”将 inputArea 的值保存到支持 bean 并让后端处理该值。

所以是的,我会做不同的事情。我认为您可以在后端处理另外两个参数,我会使用“执行”来存储 inputArea 的值。

MAG,米洛·范德泽

于 2012-01-27T13:25:29.730 回答