1

我在 xhtml jsf 页面的支持 bean 中显示来自列表的消息。

我使用 ui:repeat 循环和每条消息的回复按钮。在回复按钮上,我正在调用一个对话框,其中显示了 xhtml 页面上显示的用户名。但它总是显示列表中最后一个消息发件人的姓名。

看看我的 xhtml 代码

<h:form>
                            <div id="messages">

                                <ui:repeat var="userMsg" value="#{messagesManagedBean.userInboxMsgs}">

                                    <p:dialog modal="true" widgetVar="messageDialog" resizable="false"  width="750" height="200" header="New Message" >  



                                        <h:panelGrid columns="2">
                                            <p:column>
                                                <h:outputLabel for="msgRecepient"  value="To"/>
                                            </p:column>
                                            <p:column>
                                                <h:outputLabel id="msgRecepient" value="#{userMsg.userFullname}"  >

                                                </h:outputLabel>
                                            </p:column>
                                            <p:column>
                                                <h:outputLabel for="msgContents"  value="Message"/>
                                            </p:column>
                                            <p:column>
                                                <p:inputTextarea id="msgContents" value="#{messagesManagedBean.msg.message}" cols="65" rows="3" />


                                            </p:column>


                                            <p:column>
                                                <p:commandButton id="msgSend" value="Send"  action="#{messagesManagedBean.sendMessage(userMsg.userId,'reply')}"   oncomplete="messageDialog.hide()"  /> 
                                            </p:column>

                                        </h:panelGrid>

                                    </p:dialog>

                                    <center><img class="h-diff" src="../images/differentiator-profile.jpg" width="437" height="1" /></center>
                                    <div class="message">
                                        <div id="senderImg">
                                            <img class="senderImg" src="../images/profile-pic.jpg" width="50" height="50" />
                                        </div>
                                        <div id="message-txt-area">

                                            <div id="senderName">
                                                <p:commandLink styleClass="senderName" value="#{userMsg.userFullname}" action="#{myProfileManagedBean.loadProfileFrontInformation(userMsg.userId)}"></p:commandLink>
                                            </div>
                                            <div class="message-txt">
                                                #{userMsg.message}
                                            </div>
                                            <div class="reply-btn">
                                                <a href="#" onclick="messageDialog.show()">Reply</a>
                                            </div>

                                        </div>
                                    </div>

                                </ui:repeat>

                            </div>
                        </h:form>

现在的问题是,当我单击回复时,它会显示对话框,但“收件人”部分包含列表中最后一条消息的发件人名称。

谢谢

4

2 回答 2

4

我认为 widgetVar 被覆盖,因为您没有为 widgetVar 指定任何动态值,它始终保持为 messageDialog 值。

我认为将对话置于循环中是一种不好的做法。我建议通过使用标签作为参数传递的变量值<p:dialog>调用来重用:<p:commandLink><f:param>

<ui:repeat var="userMsg" value="#{messagesManagedBean.userInboxMsgs}">
    ...
    <p:commandLink value="Reply" onclick="messageDialog.show()">
        <f:param name="userMsg" value="#{userMsg}" />     
    </p:commandLink>
    ...
</ui:repeat>

<p:dialog modal="true" widgetVar="messageDialog" resizable="false"
          width="750" height="200" header="New Message">
    <h:panelGrid columns="2">
        <p:column>
            <h:outputLabel for="msgRecepient" value="To"/>
        </p:column>
        <p:column>
            <h:outputLabel id="msgRecepient" value="#{userMsg.userFullname}" />
        </p:column>
        <p:column>
            <h:outputLabel for="msgContents" value="Message"/>
        </p:column>
        <p:column>
            <p:inputTextarea id="msgContents" cols="65" rows="3"
                             value="#{messagesManagedBean.msg.message}" />
        </p:column>
        <p:column>
            <p:commandButton id="msgSend" value="Send" 
            action="#{messagesManagedBean.sendMessage(userMsg.userId,'reply')}"
            oncomplete="messageDialog.hide()" />
        </p:column>
    </h:panelGrid>
</p:dialog>
于 2012-06-07T12:14:32.240 回答
1

您看到的是预期行为,因为您做错了。
首先,将对话框移到 ui:repeat 之外。
然后设置对话框内的 h:panelGrid 的 ID(例如:“dialogGrid”)
在托管 bean 中添加一个属性,该属性将成为选定的消息。
替换<a href="#" onclick="messageDialog.show()">Reply</a>为以下内容:

<p:commandLink value="Reply" update="dialogGrid" oncomplete="messageDialog.show()" >
        <f:setPropertyActionListener target="#{messagesManagedBean.selectedMsg}" value="#{userMsg}" />
</p:commandLink>

最后,在对话框中,不要使用 #{userMsg} 来引用选定的消息,而是使用#{messagesManagedBean.selectedMsg}

于 2012-06-07T12:09:38.333 回答