Passing/binding inputfield UIInput.value inside ui:repeat to bean 方法

Passing/binding inputfield UIInput.value inside ui:repeat to bean method

我的评论显示在 <ui:repeat> 标签中。用户可以使用为每个评论单独显示的输入字段来回复所有评论。但是我无法设法将注释的值传递给处理它的 bean。我考虑过按照第一个答案 [by balusC here][1] 中所述传递 UIInput 值。问题是内容是空的,因为操作按钮绑定到每个 UIInput(我相信如此)。我应该在每个按钮和我的 UIInput 之间有一个个人绑定。我认为该代码有望更加不言自明。 :

<ui:repeat var="post" value="#{watchThread.listeFirstPosts}">                               
    <h:outputText value="#{post.user.username}"/>

    <div class="postContent">
        <h:outputText value="#{watchThread.sanitize(post.content)}" />
    </div>
    <div class="replyAction">
    <h:form>
        <div class="inputAreaPostFast">
            <p:inputTextarea id="reply2" value="#{watchThread.replyContent}" binding="#{inputReply}"/>
            <div class="replyBtn">

---------- Here the third param is the issue --------------
                <p:commandButton action="#{watchThread.sendReply(userNav.user, post, inputReply.value)}"/>
            </div>
        </div>
    </h:form>
    </div>
</ui:repeat>

编辑:这是对我有用的代码。 (我想)我有一个表单,不应该出现在我的 ui:repeat 标签中。还要绑定输入,请参见下面的 balusC 的 answer/comment。但是我不得不按照建议让表单标签在里面而不是在外面。

        <ui:repeat var="post" value="#{watchThread.listeFirstPosts}">
            <div class="replyBlock">                        
                <h:panelGroup id="username" style="cursor:pointer;">
                <div class="profileimgForum">                   
                    <h:graphicImage styleClass="profilepicForum" value="/images/#{post.user.profilePic}" rendered="#{!empty post.user.profilePic}"></h:graphicImage> 
                    <h:graphicImage styleClass="profilepicForum" library="images" name="profilepic1.jpg" rendered="#{empty post.user.profilePic}"></h:graphicImage>     
                </div>
                <span class="posterTitle">
                <h:outputText value="#{post.user.username}"></h:outputText> </span>
                <h:outputText value="  #{watchThread.formatTimeReply(post.datePost)}"/>

                </h:panelGroup>

                <div class="replyContent">
                    <h:outputText value="#{watchThread.sanitize(post.content)}" style="pointer:cursor;"/>
                </div>
                <div class="replyAction">
                     <p:inplace id="facet" effect="none">
                        <f:facet name="output">
                            #{strings.Reply}
                        </f:facet>
                        <f:facet name="input">
                        <h:form>
                            <div class="inputAreaPostFast">
                                <p:inputTextarea id="reply2" cols="70" rows="7" value="#{watchThread.replyContent}" binding="#{inputReply}" maxlength="500"/>
                                <div class="replyBtn">
                                    <p:commandButton update="growl" style=" margin-right: 2em;" value="#{strings.Reply}" action="#{watchThread.sendReply(userNav.user, post, inputReply)}"/>
                                </div>
                            </div>
                        </h:form>
                        </f:facet>
                    </p:inplace>
                </div>
                <ui:repeat var="areply" value="#{post.posts}">
                    #{areply.content} ----
                </ui:repeat>

            </div>


            <!-- ####### Dialog username ######## -->
            <p:overlayPanel for="username" id="usernamePanel" dynamic="true" showCloseIcon="true" appendToBody="1" dismissable="false">
                 <div class="dlgTopBlock">
                         <div class="dlgPicBlock">    
                            <h:graphicImage styleClass="profilePicDialog" value="/images/#{post.user.profilePic}" rendered="#{!empty post.user.profilePic}"/> 
                            <h:graphicImage styleClass="profilePicDialog" library="images" name="profilepic1.jpg" rendered="#{empty post.user.profilePic}"/>    
                         </div>
                         <div class="dlgTopSubBlock"><div class="dlgTopTitle">
                             <h:graphicImage styleClass="flag" library="images/flags" 
                                            name="#{post.user.countryBean.iso2}.png" 
                                            rendered="#{! empty post.user.countryBean.iso2}"/>
                            <h:link value="#{post.user.username}" outcome="/user.xhtml">
                                <f:param name="username" value="#{post.user.username}"></f:param>
                            </h:link>

                            </div>
                            <div class="dlgRep">
                                <h:outputText value="#{post.user.reputation} #{strings.repPoints} "></h:outputText>
                            </div>
                         <div class="dlgTopStatus">
                            <h:outputText value="#{post.user.status}"/></div>

                        </div>                      
             </div>
             <div class="btnDlg">
                <h:panelGroup rendered="#{userNav.isUserConnected  and userNav.username != post.user.username}">
                    <p:commandButton value="#{usernavmsg.SendPM}" icon="ui-icon-mail-closed" onclick="PF('sendMsgDlg').show();"></p:commandButton> 
                    <p:commandButton id="addFriend" value="#{friendBean.btnText}" action="#{friendBean.addFriend()}" update="growl addFriend" icon="#{friendBean.icon}"
                                rendered="#{friendBean.rendered}"/>
                </h:panelGroup>
             </div>

             <p:dialog header="#{usernavmsg.SendingTo}: #{post.user.username}" 
                       dynamic="true" modal="false" widgetVar="sendMsgDlg" minHeight="40">
                <h:form>
                    <p:inputTextarea value="#{pMbean.title}" rows="1" cols="110" id="title" >
                        <f:passThroughAttribute name="placeholder" value="#{usernavmsg.Title}"/>
                    </p:inputTextarea><br/><br/>
                    <p:inputTextarea value="#{pMbean.message}" id="msg" rows="10" cols="110" autoResize="true">
                        <f:passThroughAttribute name="placeholder" value="#{usernavmsg.YourMsg}"/>
                    </p:inputTextarea><br/>

                    <p:commandButton style="float:right;"  value="#{usernavmsg.Send}" action="#{pMbean.send(post.user)}" 
                                    onclick="PF('sendMsgDlg').hide();" icon="ui-icon-mail-closed" update="growl"></p:commandButton>
                </h:form>
            </p:dialog>
        </p:overlayPanel> 

        <!-- ######### End of dialog user ######## -->
        </ui:repeat>

唯一可见的错误如下:

<ui:repeat value="#{watchThread.listeFirstPosts}" var="post" ...>
    <p:inputTextarea ... value="#{watchThread.replyContent}">

您基本上是将 每次 迭代的输入字段的值绑定到一个相同的支持 bean 属性。因此,每一轮迭代都将覆盖前一轮迭代的值。这是不对的。输入字段的值必须绑定到当前迭代轮次。 IE。它基本上应该如下所示:

<ui:repeat value="#{watchThread.listeFirstPosts}" var="post" ...>
    <p:inputTextarea ... value="#{post.replyContent}">

但是,在这个结构中你实际上并不需要它。完全摆脱 value 属性并依赖于您最初想要使用的 binding


然后,评论中指出的另一个错误:嵌套表格。这在 HTML 中是非法的。不要以产生非法 HTML 的方式编写 JSF 代码。 Mojarra 中的错误形式可能还有另一个潜在原因,它仅在您在嵌套 <ui:repeat> 中使用 <f:ajax> 时才会暴露。解决方案是使用完全有价值的 UIData 组件,例如 <h:dataTable> 或 PrimeFaces 网格之一。