在ui中传递/绑定inputfield UIInput.value:重复到bean方法

时间:2015-07-13 12:20:05

标签: jsf jsf-2.2

我在<ui:repeat>标记中显示的评论。用户可以使用针对每个评论单独显示的输入字段来回复所有评论。但是,我无法将注释的值传递给处理它的bean。我考虑过传递UIInput值,如第一个答案[balusC here] [1]中所述。问题是内容是空的,因为操作按钮绑定到每个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的表格:重复标记。另外要绑定输入,请参阅下面的balusC的答案/注释。但是我必须让表格标签在里面而不是在建议之外。

        <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>

1 个答案:

答案 0 :(得分:1)

唯一可见的错误如下:

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

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

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

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

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